summaryrefslogtreecommitdiff
path: root/libs/regex/doc/html/boost_regex/background_information/faq.html
blob: 599ee1870b6843d65db6de96a5019db05741a746 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>FAQ</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Boost.Regex 5.0.1">
<link rel="up" href="../background_information.html" title="Background Information">
<link rel="prev" href="futher.html" title="References and Further Information">
<link rel="next" href="performance.html" title="Performance">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="futher.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../background_information.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_regex.background_information.faq"></a><a class="link" href="faq.html" title="FAQ">FAQ</a>
</h3></div></div></div>
<p>
        <span class="bold"><strong>Q.</strong></span> I can't get regex++ to work with escape
        characters, what's going on?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> If you embed regular expressions in C++
        code, then remember that escape characters are processed twice: once by the
        C++ compiler, and once by the Boost.Regex expression compiler, so to pass
        the regular expression \d+ to Boost.Regex, you need to embed "\d+"
        in your code. Likewise to match a literal backslash you will need to embed
        "\\" in your code.
      </p>
<p>
        <span class="bold"><strong>Q.</strong></span> No matter what I do regex_match always
        returns false, what's going on?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> The algorithm regex_match only succeeds
        if the expression matches <span class="bold"><strong>all</strong></span> of the text,
        if you want to <span class="bold"><strong>find</strong></span> a sub-string within
        the text that matches the expression then use regex_search instead.
      </p>
<p>
        <span class="bold"><strong>Q.</strong></span> Why does using parenthesis in a POSIX
        regular expression change the result of a match?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> For POSIX (extended and basic) regular
        expressions, but not for perl regexes, parentheses don't only mark; they
        determine what the best match is as well. When the expression is compiled
        as a POSIX basic or extended regex then Boost.Regex follows the POSIX standard
        leftmost longest rule for determining what matched. So if there is more than
        one possible match after considering the whole expression, it looks next
        at the first sub-expression and then the second sub-expression and so on.
        So...
      </p>
<p>
        "(0*)([0-9]*)" against "00123" would produce $1 = "00"
        $2 = "123"
      </p>
<p>
        where as
      </p>
<p>
        "0*([0-9])*" against "00123" would produce $1 = "00123"
      </p>
<p>
        If you think about it, had $1 only matched the "123", this would
        be "less good" than the match "00123" which is both further
        to the left and longer. If you want $1 to match only the "123"
        part, then you need to use something like:
      </p>
<p>
        "0*([1-9][0-9]*)"
      </p>
<p>
        as the expression.
      </p>
<p>
        <span class="bold"><strong>Q.</strong></span> Why don't character ranges work properly
        (POSIX mode only)?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> The POSIX standard specifies that character
        range expressions are locale sensitive - so for example the expression [A-Z]
        will match any collating element that collates between 'A' and 'Z'. That
        means that for most locales other than "C" or "POSIX",
        [A-Z] would match the single character 't' for example, which is not what
        most people expect - or at least not what most people have come to expect
        from regular expression engines. For this reason, the default behaviour of
        Boost.Regex (perl mode) is to turn locale sensitive collation off by not
        setting the <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">collate</span></code>
        compile time flag. However if you set a non-default compile time flag - for
        example <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">extended</span></code> or <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">basic</span></code>,
        then locale dependent collation will be enabled, this also applies to the
        POSIX API functions which use either <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">extended</span></code>
        or <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">basic</span></code> internally. [Note - when <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">nocollate</span></code> in effect, the library behaves
        "as if" the LC_COLLATE locale category were always "C",
        regardless of what its actually set to - end note].
      </p>
<p>
        <span class="bold"><strong>Q.</strong></span> Why are there no throw specifications
        on any of the functions? What exceptions can the library throw?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> Not all compilers support (or honor)
        throw specifications, others support them but with reduced efficiency. Throw
        specifications may be added at a later date as compilers begin to handle
        this better. The library should throw only three types of exception: [boost::regex_error]
        can be thrown by <a class="link" href="../ref/basic_regex.html" title="basic_regex"><code class="computeroutput"><span class="identifier">basic_regex</span></code></a> when compiling a regular
        expression, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span></code> can be thrown when a call
        to <code class="computeroutput"><span class="identifier">basic_regex</span><span class="special">::</span><span class="identifier">imbue</span></code> tries to open a message catalogue
        that doesn't exist, or when a call to <a class="link" href="../ref/regex_search.html" title="regex_search"><code class="computeroutput"><span class="identifier">regex_search</span></code></a> or <a class="link" href="../ref/regex_match.html" title="regex_match"><code class="computeroutput"><span class="identifier">regex_match</span></code></a> results in an "everlasting"
        search, or when a call to <code class="computeroutput"><span class="identifier">RegEx</span><span class="special">::</span><span class="identifier">GrepFiles</span></code>
        or <code class="computeroutput"><span class="identifier">RegEx</span><span class="special">::</span><span class="identifier">FindFiles</span></code> tries to open a file that cannot
        be opened, finally <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> can be thrown by just about any
        of the functions in this library.
      </p>
<p>
        <span class="bold"><strong>Q.</strong></span> Why can't I use the "convenience"
        versions of regex_match / regex_search / regex_grep / regex_format / regex_merge?
      </p>
<p>
        <span class="bold"><strong>A.</strong></span> These versions may or may not be available
        depending upon the capabilities of your compiler, the rules determining the
        format of these functions are quite complex - and only the versions visible
        to a standard compliant compiler are given in the help. To find out what
        your compiler supports, run &lt;boost/regex.hpp&gt; through your C++ pre-processor,
        and search the output file for the function that you are interested in. Note
        however, that very few current compilers still have problems with these overloaded
        functions.
      </p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 1998-2013 John Maddock<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="futher.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../background_information.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>