gpt4 book ai didi

ruby - 正则表达式匹配组,但组成员除外

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:06 27 4
gpt4 key购买 nike

因此,有许多匹配特定组的正则表达式,如下所示:

/./ - 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

在 ruby 中:

/[[:punct:]]/ - Punctuation character
/[[:space:]]/ - Whitespace character ([:blank:], newline, carriage return, etc.)
/[[:upper:]]/ - Uppercase alphabetical

所以,这是我的问题:如何获得正则表达式来匹配这样的组,但将字符排除在外?

例子:

  • 匹配除问号以外的所有标点符号
  • 匹配除新行之外的所有空白字符
  • 匹配除“go”...等之外的所有单词

谢谢。

最佳答案

您可以使用字符类减法。

Rexegg :

The syntax […&&[…]] allows you to use a logical AND on several character classes to ensure that a character is present in them all. Intersecting with a negated character, as in […&&[^…]] allows you to subtract that class from the original class.

考虑 this code :

s = "./?!"
res = s.scan(/[[:punct:]&&[^!]]/)
puts res

输出只有 ./?,因为 ! 被排除在外。

使用前瞻性限制(正如 sawa 刚才写的那样)也是可能的,但是当你支持这个减法时就不需要了。当您需要限制一些较长的值(超过 1 个字符)时,需要先行。在许多情况下,前瞻必须锚定到单词边界才能返回正确的结果。作为使用前瞻限制标点符号的示例(单个字符匹配通用模式):

/(?:(?!!)[[:punct:]])+/

这将匹配 1 个或多个标点符号,但 !

puts "./?!".scan(/(?:(?!!)[[:punct:]])+/) 代码将输出 ./? (参见 demo)

当您需要限制单个字符时,使用字符类减法,它比使用前瞻更有效。

因此,第三种情况的正则表达式必须如下所示:

/\b(?!go\b)\w+\b/
^^

如果您编写 /(?!\bgo\b)\b\w+\b/,正则表达式引擎将检查输入字符串中的每个位置。如果您在开头使用 \b,则只会检查单词边界位置,并且该模式会产生更好的性能。另请注意,^^ \b 非常重要,因为它使正则表达式引擎检查 整个单词 go。如果您删除它,它只会限制不以 go 开头的单词。

关于ruby - 正则表达式匹配组,但组成员除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34691306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com