当前位置:  开发笔记 > 编程语言 > 正文

regexp匹配组,但该组的成员除外

如何解决《regexp匹配组,但该组的成员除外》经验,为你挑选了1个好方法。

因此,有一些正则表达式匹配特定组,如下所示:

/./ - 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"等所有单词

谢谢.



1> Wiktor Strib..:

您可以使用字符类减法.

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的单词.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有