我正在学习正则表达式.到目前为止,我似乎能够使用方括号(即[])实现我想要的一切,在其他人的代码中我经常看到使用的parantheses,我想知道什么是paranthesis的一些好的案例/用途.
我可以举一些例子吗?
这是正则表达式初学者中常见的错误,而且是一个严重错误.方括号用于创建字符类,而括号用于创建组.这些结构不仅用于不同的目的,它们的功能也没有重叠.特别是,方括号不用于分组.以下是一些示例:
(abc)匹配的序列"abc"
[abc]相匹配的字符中的一个'a','b'或'c'.
(abc)+匹配abc一个或更多次("abc","abcabc"等)
[abc]+从该组匹配一个或多个字符{'a', 'b', 'c'}("a","cc","baccbcaab"等)
(x+)匹配至少一个'x'("x","xx","xxxxxxxx"等)
[x+]一致'x'或'+'(字母"X"或文字加号-最正则表达式的元字符失去字符类中的特殊含义)
(a-z)匹配的序列"a-z"('a',连字符'z')
[a-z]任意一个字符匹配的范围内a通过z包括
(\d)匹配数字 - \d是[0-9](ASCII语义)或\p{Nd}(Unicode语义;"十进制数字")
[\d]与数字匹配的简写 - 与元字符不同,字符类缩写在"longhand"(或枚举)字符类中保留其含义
(\d\d)匹配两位数
[\d\d]匹配一位数
字符类是一个原子:它消耗的一个字符,同样作为像文字字符x或%或?一样.但它允许您定义一组字符,如果它是该集合的成员,它将使用下一个字符.(多次指定相同的字符无效:[abracadabra]从集合中消耗一个字符{'a', 'b', 'c', 'd', 'r'}.)
一个组包含一个或多个原子,允许它们像单个原子一样处理:
abc?消耗一个'a',然后是'b',和下一个字符,如果恰好是'c'.(abc)?消费"abc"或没有.虽然有很多种群体,服务于不同的目的,但它们都不等同于一个角色类.您可以在组内使用交替来实现类似的结果 - 例如,(a|b|c)将匹配相同的东西 - [abc]但它本身效率较低,而且可读性较差.事实上,正如这个答案所解释的那样,它很容易导致灾难.如果您可以在字符类和替换之间进行选择,则应始终使用字符类.如果你需要捕获角色,请将这个类包装在parens中:.([abc])