因此,有一些正则表达式匹配特定组,如下所示:
/./ - Any character except a newline. /./m - Any character (the m modifier enables multiline mode) /\w/ - A word character ([a-zA-Z0-9_]) /\s/ - Any whitespace character
在红宝石中:
/[[:punct:]]/ - Punctuation character /[[:space:]]/ - Whitespace character ([:blank:], newline, carriage return, etc.) /[[:upper:]]/ - Uppercase alphabetical
所以,这是我的问题:如何获得正则表达式匹配这样的组,但免除一个字符?
例子:
匹配除问号之外的所有标点符号
匹配除新行之外的所有空白字符
匹配除"go"等所有单词
谢谢.
您可以使用字符类减法.
Rexegg:
语法
[…&&[…]]
允许您在多个字符类上使用逻辑AND,以确保所有字符都存在.用否定字符相交,如在[…&&[^…]]
允许你减去类从原来的类.
考虑以下代码:
s = "./?!" res = s.scan(/[[:punct:]&&[^!]]/) puts res
输出是只.
,/
并且?
由于!
被排除在外.
使用前瞻限制(如sawa刚刚编写的那样)也是可能的,但是当你支持这个减法时则不需要.当您需要限制一些较长的值(超过1个字符)时,需要前瞻.在许多情况下,必须将前瞻锚定到单词边界以返回正确的结果.作为使用前瞻来限制标点符号的示例(单字符匹配通用模式):
/(?:(?!!)[[:punct:]])+/
这将匹配1个或多个标点符号,但a !
.
该puts "./?!".scan(/(?:(?!!)[[:punct:]])+/)
代码将输出./?
(见演示)
只要需要限制单个字符,就可以使用字符类减法,这比使用前瞻更有效.
所以,第三种场景正则表达式必须如下所示:
/\b(?!go\b)\w+\b/ ^^
如果你写/(?!\bgo\b)\b\w+\b/
,正则表达式引擎将检查输入字符串中的每个位置.如果\b
在开头使用a ,则仅检查字边界位置,并且该模式将产生更好的性能.另请注意,^^ \b
非常重要,因为它使正则表达式引擎检查整个单词go
.如果删除它,它将仅限于不以字母开头go
的单词.