open source driving agent
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
7.0 KiB

'\" t
.\" Title: zrex
.\" Author: [see the "AUTHORS" section]
.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
.\" Date: 12/31/2016
.\" Manual: CZMQ Manual
.\" Source: CZMQ 4.0.2
.\" Language: English
.\"
.TH "ZREX" "3" "12/31/2016" "CZMQ 4\&.0\&.2" "CZMQ Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
zrex \- work with regular expressions
.SH "SYNOPSIS"
.sp
.nf
// Constructor\&. Optionally, sets an expression against which we can match
// text and capture hits\&. If there is an error in the expression, reports
// zrex_valid() as false and provides the error in zrex_strerror()\&. If you
// set a pattern, you can call zrex_matches() to test it against text\&.
CZMQ_EXPORT zrex_t *
zrex_new (const char *expression);
// Destructor
CZMQ_EXPORT void
zrex_destroy (zrex_t **self_p);
// Return true if the expression was valid and compiled without errors\&.
CZMQ_EXPORT bool
zrex_valid (zrex_t *self);
// Return the error message generated during compilation of the expression\&.
CZMQ_EXPORT const char *
zrex_strerror (zrex_t *self);
// Returns true if the text matches the previously compiled expression\&.
// Use this method to compare one expression against many strings\&.
CZMQ_EXPORT bool
zrex_matches (zrex_t *self, const char *text);
// Returns true if the text matches the supplied expression\&. Use this
// method to compare one string against several expressions\&.
CZMQ_EXPORT bool
zrex_eq (zrex_t *self, const char *text, const char *expression);
// Returns number of hits from last zrex_matches or zrex_eq\&. If the text
// matched, returns 1 plus the number of capture groups\&. If the text did
// not match, returns zero\&. To retrieve individual capture groups, call
// zrex_hit ()\&.
CZMQ_EXPORT int
zrex_hits (zrex_t *self);
// Returns the Nth capture group from the last expression match, where
// N is 0 to the value returned by zrex_hits()\&. Capture group 0 is the
// whole matching string\&. Sequence 1 is the first capture group, if any,
// and so on\&.
CZMQ_EXPORT const char *
zrex_hit (zrex_t *self, uint index);
// Fetches hits into string variables provided by caller; this makes for
// nicer code than accessing hits by index\&. Caller should not modify nor
// free the returned values\&. Returns number of strings returned\&. This
// method starts at hit 1, i\&.e\&. first capture group, as hit 0 is always
// the original matched string\&.
CZMQ_EXPORT int
zrex_fetch (zrex_t *self, const char **string_p, \&.\&.\&.);
// Self test of this class
CZMQ_EXPORT void
zrex_test (bool verbose);
Please add \*(Aq@interface\*(Aq section in \*(Aq\&./\&.\&./src/zrex\&.c\*(Aq\&.
.fi
.SH "DESCRIPTION"
.sp
Wraps a very simple regular expression library (SLRE) as a CZMQ class\&. Supports this syntax:
.sp
.if n \{\
.RS 4
.\}
.nf
^ Match beginning of a buffer
$ Match end of a buffer
() Grouping and substring capturing
[\&.\&.\&.] Match any character from set
[^\&.\&.\&.] Match any character but ones from set
\&. Match any character
\es Match whitespace
\eS Match non\-whitespace
\ed Match decimal digit
\eD Match non decimal digit
\ea Match alphabetic character
\eA Match non\-alphabetic character
\ew Match alphanumeric character
\eW Match non\-alphanumeric character
\er Match carriage return
\en Match newline
+ Match one or more times (greedy)
+? Match one or more times (non\-greedy)
* Match zero or more times (greedy)
*? Match zero or more times (non\-greedy)
? Match zero or once
\exDD Match byte with hex value 0xDD
\emeta Match one of the meta character: ^$()\&.[*+?\e
.fi
.if n \{\
.RE
.\}
.sp
Please add \fI@discuss\fR section in \fI\&./\&.\&./src/zrex\&.c\fR\&.
.SH "EXAMPLE"
.PP
\fBFrom zrex_test method\fR.
.sp
.if n \{\
.RS 4
.\}
.nf
// This shows the pattern of matching many lines to a single pattern
zrex_t *rex = zrex_new ("\e\ed+\-\e\ed+\-\e\ed+");
assert (rex);
assert (zrex_valid (rex));
bool matches = zrex_matches (rex, "123\-456\-789");
assert (matches);
assert (zrex_hits (rex) == 1);
assert (streq (zrex_hit (rex, 0), "123\-456\-789"));
assert (zrex_hit (rex, 1) == NULL);
zrex_destroy (&rex);
// Here we pick out hits using capture groups
rex = zrex_new ("(\e\ed+)\-(\e\ed+)\-(\e\ed+)");
assert (rex);
assert (zrex_valid (rex));
matches = zrex_matches (rex, "123\-456\-ABC");
assert (!matches);
matches = zrex_matches (rex, "123\-456\-789");
assert (matches);
assert (zrex_hits (rex) == 4);
assert (streq (zrex_hit (rex, 0), "123\-456\-789"));
assert (streq (zrex_hit (rex, 1), "123"));
assert (streq (zrex_hit (rex, 2), "456"));
assert (streq (zrex_hit (rex, 3), "789"));
zrex_destroy (&rex);
// This shows the pattern of matching one line against many
// patterns and then handling the case when it hits
rex = zrex_new (NULL); // No initial pattern
assert (rex);
char *input = "Mechanism: CURVE";
matches = zrex_eq (rex, input, "Version: (\&.+)");
assert (!matches);
assert (zrex_hits (rex) == 0);
matches = zrex_eq (rex, input, "Mechanism: (\&.+)");
assert (matches);
assert (zrex_hits (rex) == 2);
const char *mechanism;
zrex_fetch (rex, &mechanism, NULL);
assert (streq (zrex_hit (rex, 1), "CURVE"));
assert (streq (mechanism, "CURVE"));
zrex_destroy (&rex);
.fi
.if n \{\
.RE
.\}
.sp
.SH "AUTHORS"
.sp
The czmq manual was written by the authors in the AUTHORS file\&.
.SH "RESOURCES"
.sp
Main web site: \m[blue]\fB\%\fR\m[]
.sp
Report bugs to the email <\m[blue]\fBzeromq\-dev@lists\&.zeromq\&.org\fR\m[]\&\s-2\u[1]\d\s+2>
.SH "COPYRIGHT"
.sp
Copyright (c) the Contributors as noted in the AUTHORS file\&. This file is part of CZMQ, the high\-level C binding for 0MQ: http://czmq\&.zeromq\&.org\&. This Source Code Form is subject to the terms of the Mozilla Public License, v\&. 2\&.0\&. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla\&.org/MPL/2\&.0/\&. LICENSE included with the czmq distribution\&.
.SH "NOTES"
.IP " 1." 4
zeromq-dev@lists.zeromq.org
.RS 4
\%mailto:zeromq-dev@lists.zeromq.org
.RE