文档章节

c++1.0-----源码分析正则表达式的错误类型

o
 osc_1ee7cxmx
发布于 2018/08/06 14:38
字数 592
阅读 8
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

在c++primer 第五版第649页出现了表17.7--正则表达式错误类型。它到底是什么? 到底怎么用?让我们利用源码一探究竟:

源码:

 1 namespace regex_constants
 2 {
 3 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 4 
 5   /**
 6    * @name 5.3 Error Types
 7    */
 8   //@{
 9 
10   enum error_type
11     {
12       _S_error_collate,
13       _S_error_ctype,
14       _S_error_escape,
15       _S_error_backref,
16       _S_error_brack,
17       _S_error_paren,
18       _S_error_brace,
19       _S_error_badbrace,
20       _S_error_range,
21       _S_error_space,
22       _S_error_badrepeat,
23       _S_error_complexity,
24       _S_error_stack,
25     };
26 
27   /** The expression contained an invalid collating element name. */
28   constexpr error_type error_collate(_S_error_collate);
29 
30   /** The expression contained an invalid character class name. */
31   constexpr error_type error_ctype(_S_error_ctype);
32 
33   /**
34    * The expression contained an invalid escaped character, or a trailing
35    * escape.
36    */
37   constexpr error_type error_escape(_S_error_escape);
38 
39   /** The expression contained an invalid back reference. */
40   constexpr error_type error_backref(_S_error_backref);
41 
42   /** The expression contained mismatched [ and ]. */
43   constexpr error_type error_brack(_S_error_brack);
44 
45   /** The expression contained mismatched ( and ). */
46   constexpr error_type error_paren(_S_error_paren);
47 
48   /** The expression contained mismatched { and } */
49   constexpr error_type error_brace(_S_error_brace);
50 
51   /** The expression contained an invalid range in a {} expression. */
52   constexpr error_type error_badbrace(_S_error_badbrace);
53 
54   /**
55    * The expression contained an invalid character range,
56    * such as [b-a] in most encodings.
57    */
58   constexpr error_type error_range(_S_error_range);
59 
60   /**
61    * There was insufficient memory to convert the expression into a
62    * finite state machine.
63    */
64   constexpr error_type error_space(_S_error_space);
65 
66   /**
67    * One of <em>*?+{</em> was not preceded by a valid regular expression.
68    */
69   constexpr error_type error_badrepeat(_S_error_badrepeat);
70 
71   /**
72    * The complexity of an attempted match against a regular expression
73    * exceeded a pre-set level.
74    */
75   constexpr error_type error_complexity(_S_error_complexity);
76 
77   /**
78    * There was insufficient memory to determine whether the
79    * regular expression could match the specified character sequence.
80    */
81   constexpr error_type error_stack(_S_error_stack);
82 
83   //@}
84 _GLIBCXX_END_NAMESPACE_VERSION
85 }

解读:

error_collate是枚举类型error_type的常量表达式,在编译器就确定好了error_type的值:_S_error_collate 对应到整型常量就是 0.
error_ctype是枚举类型error_type的常量表达式,在编译器就确定好了error_type的值:_S_error_ctype,对应到整型常量就是 1.
其它就是依此类推。
error_collate 0
error_ctype 1
error_escape 2
error_backref 3
error_brack 4
error_paren 5
error_brace 6
error_badbrace 7
error_range 8
error_space 9
error_badrepeat 10
error_complexity 11
error_stack 12

如何使用?

  其实不用刻意使用,在正则表达式错误的时候,就会报出相应的错误。

  例如:

  

1 try {
2         regex r("[[:alnum:]]+\\.cpp|cxx|cc)$", regex::icase);
3     } catch (regex_error e)
4     { cout << e.what() << "\ncode: " << e.code() << endl; }

这个时候第二行少了一个左括号,应该会爆出error_paren的错误,对应的数值是5,编译发现

因此验证通过。

 

综上所述

  error_collate不是类类型,不是函数,而是一个整型常量0~12,用来表示regex_error的错误具体是什么样子的。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

聊聊dubbo-go的AccessLogFilter

序 本文主要研究一下dubbo-go的AccessLogFilter AccessLogFilter dubbo-go-v1.4.2/filter/filter_impl/access_log_filter.go type AccessLogFilter struct {logChan chan AccessLogData}......

go4it
昨天
24
0
对服务与工厂感到困惑 - Confused about Service vs Factory

问题: As I understand it, when inside a factory I return an object that gets injected into a controller. 据我了解,当在工厂内部时,我返回一个被注入控制器的对象。 When inside a ...

技术盛宴
昨天
25
0
OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
昨天
24
0
将向量附加到向量[重复] - Appending a vector to a vector [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: Concatenating two std::vectors 22 answers 连接两个std :: vectors 22个答案 Assuming I have 2 standa......

javail
昨天
19
0
获得所有文件夹的大小

有两个工具 https://www.getfoldersize.com/ http://www.uderzo.it/main_products/space_sniffer/index.html...

ethanleellj
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部