Regex

优质
小牛编辑
131浏览
2023-12-01

头文件: "boost/regex.hpp"

正则表达式被封装为一个类型 basic_regex的对象。我们将在下一节更深入地讨论正则表达式如何被编译和分析,这里我们首先粗略地看看 basic_regex ,以及这个库中三个最重要的算法。

namespace boost {
  template <class charT,
            class traits=regex_traits<charT> >
  class basic_regex {
  public:
    explicit basic_regex(
      const charT* p, 
      flag_type f=regex_constants::normal);

    bool empty() const; 

    unsigned mark_count() const; 

    flag_type flags() const;
  };

  typedef basic_regex<char> regex;
  typedef basic_regex<wchar_t> wregex;
}

成员函数

explicit basic_regex (
  const charT* p, 
  flag_type f=regex_constants::normal);

这个构造函数接受一个包含正则表达式的字符序列,还有一个参数用于指定使用正则表达式时的选项,例如是否忽略大小写。如果p中的正则表达式无效,则抛出一个 bad_expressionregex_error 的异常。注意这两个异常其实是同一个东西;在写这本书之时,尚未改变当前使用的名字 bad_expression ,但下一个版本的Boost.Regex将会使用 regex_error.

bool empty() const;

这个成员函数是一个谓词,当basic_regex实例没有包含一个有效的正则表达式时返回 true ,即它被赋予一个空的字符序列时。

unsigned mark_count() const;

mark_count 返回regex中带标记子表达式的数量。带标记子表达式是指正则表达式中用圆括号括起来的部分。匹配这个子表达式的文本可以通过调用某个正则表达式算法而获得。

flag_type flags() const;

返回一个位掩码,其中包含这个basic_regex所设置的选项标志。例如标志 icase, 表示正则表达式忽略大小写,标志 JavaScript, 表示regex使用JavaScript的语法。

typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;

不要使用类型 basic_regex来定义变量,你应该使用这两个typedef中的一个。这两个类型,regexwregex, 是两种字符类型的缩写,就如 stringwstringbasic_string&lt;char&gt;basic_string&lt;wchar_t&gt;的缩写一样。这种相似性是不一样的,某种程度上,regex 是一个特定类型的字符串的容器。

普通函数

template <class charT,class Allocator,class traits >
  bool regex_match(
    const charT* str, 
    match_results<const charT*,Allocator>& m,
    const basic_regex<charT,traits >& e,
    match_flag_type flags = match_default);

regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 false. 如果整个序列被成功匹配,regex_match 返回 True.

template <class charT,class Allocator, class traits> 
  bool regex_search(
    const charT* str,
    match_results<const charT*,Allocator>& m,
    const basic_regex<charT,traits >& e,
    match_flag_type flags = match_default);

regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。你可以用 regex_search 来查找输入中的一个子序列,该子序列匹配正则表达式 e.

template <class traits,class charT>
  basic_string<charT> regex_replace(
    const basic_string<charT>& s,
    const basic_regex<charT,traits >& e,
    const basic_string<charT>& fmt,
    match_flag_type flags = match_default);

regex_replace 在整个字符序列中查找正则表达式e的所有匹配。这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行格式化。缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。

这三个算法都有几个不同的重载形式:一个接受 const charT* (charT 为字符类型), 另一个接受 const basic_string&lt;charT&gt;&, 还有一个重载接受两个双向迭代器作为输入参数。