Blame view

3rdparty/boost_1_81_0/libs/xpressive/doc/results.qbk 4.38 KB
73ef4ff3   Hu Chunming   提交三方库
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
  [/
   / Copyright (c) 2008 Eric Niebler
   /
   / Distributed under the Boost Software License, Version 1.0. (See accompanying
   / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
   /]
  
  [section Accessing Results]
  
  [h2 Overview]
  
  Sometimes, it is not enough to know simply whether a _regex_match_ or _regex_search_ was successful or not. If
  you pass an object of type _match_results_ to _regex_match_ or _regex_search_, then after the algorithm has completed
  successfully the _match_results_ will contain extra information about which parts of the regex matched which parts
  of the sequence. In Perl, these sub-sequences are called ['back-references], and they are stored in the variables
  [^$1], [^$2], etc. In xpressive, they are objects of type _sub_match_, and they are stored in the _match_results_
  structure, which acts as a vector of _sub_match_ objects.
  
  [h2 match_results]
  
  So, you've passed a _match_results_ object to a regex algorithm, and the algorithm has succeeded. Now you want
  to examine the results. Most of what you'll be doing with the _match_results_ object is indexing into it to access
  its internally stored _sub_match_ objects, but there are a few other things you can do with a _match_results_
  object besides.
  
  The table below shows how to access the information stored in a _match_results_ object named `what`.
  
  [table match_results<> Accessors
      [[Accessor]             [Effects]]
      [[`what.size()`]        [Returns the number of sub-matches, which is always greater than zero after a successful match because the full match is stored in the zero-th sub-match.]]
      [[`what[n]`]            [Returns the ['n]-th sub-match.]]
      [[`what.length(n)`]     [Returns the length of the ['n]-th sub-match. Same as `what[n].length()`.]]
      [[`what.position(n)`]   [Returns the offset into the input sequence at which the ['n]-th sub-match begins.]]
      [[`what.str(n)`]        [Returns a `std::basic_string<>` constructed from the ['n]-th sub-match. Same as `what[n].str()`.]]
      [[`what.prefix()`]      [Returns a _sub_match_ object which represents the sub-sequence from the beginning of the input sequence to the start of the full match.]]
      [[`what.suffix()`]      [Returns a _sub_match_ object which represents the sub-sequence from the end of the full match to the end of the input sequence.]]
      [[`what.regex_id()`]    [Returns the `regex_id` of the _basic_regex_ object that was last used with this _match_results_ object.]]
  ]
  
  There is more you can do with the _match_results_ object, but that will be covered when we talk about
  [link boost_xpressive.user_s_guide.grammars_and_nested_matches Grammars and Nested Matches].
  
  [h2 sub_match]
  
  When you index into a _match_results_ object, you get back a _sub_match_ object. A _sub_match_ is basically a pair
  of iterators. It is defined like this:
  
      template< class BidirectionalIterator >
      struct sub_match
          : std::pair< BidirectionalIterator, BidirectionalIterator >
      {
          bool matched;
          // ...
      };
  
  Since it inherits publicaly from `std::pair<>`, _sub_match_ has `first` and `second` data members of type
  `BidirectionalIterator`. These are the beginning and end of the sub-sequence this _sub_match_ represents.
  _sub_match_ also has a Boolean `matched` data member, which is true if this _sub_match_ participated in the full
  match.
  
  The following table shows how you might access the information stored in a _sub_match_ object called `sub`.
  
  [table sub_match<> Accessors
      [[Accessor]             [Effects]]
      [[`sub.length()`]       [Returns the length of the sub-match. Same as `std::distance(sub.first,sub.second)`.]]
      [[`sub.str()`]          [Returns a `std::basic_string<>` constructed from the sub-match. Same as `std::basic_string<char_type>(sub.first,sub.second)`.]]
      [[`sub.compare(str)`]   [Performs a string comparison between the sub-match and `str`, where `str` can be a `std::basic_string<>`, C-style null-terminated string, or another sub-match. Same as `sub.str().compare(str)`.]]
  ]
  
  [h2 __alert__ Results Invalidation __alert__]
  
  Results are stored as iterators into the input sequence. Anything which invalidates
  the input sequence will invalidate the match results. For instance, if you match a `std::string` object,
  the results are only valid until your next call to a non-const member function of that `std::string` object.
  After that, the results held by the _match_results_ object are invalid. Don't use them!
  
  [endsect]