以下是我想在 Ruby 中与 Regex 匹配的行:
Klima
kjhiasug-Klimaanlage
这是我不想匹配的一个:
keine Klima
为此,我需要一个能够做到这一点的正则表达式。我试过了
(?!keine)\s?Klima
但它似乎不起作用。
关于如何解决这个问题的任何建议?
r = /(?<!keine )Klima/
r =~ "Klima" # => match
r =~ "kjhiasug-Klimaanlage" # => match
r =~ "keine Klima" # => no match
我会使用类似的东西:
foo = ["Klima", "kjhiasug-Klimaanlage", "keine Klima"]
foo.select{ |s|
s[/^Klima|\bKlimaan\B/]
}
在 IRB 中运行时返回:
=> ["Klima", "kjhiasug-Klimaanlage"]
\b
和\B
是断词标记,用于标记单词从“单词”字符转换为非单词字符的位置。\b
标记断词边界,并且\B
是相反的,即一个词没有断的地方。字符-K
之间有一个分词,因此\b
在该点匹配。nl
没有中断,因为两个字母都是组成\w
( [a-zA-Z0-9_]
) 的字符集中的单词字符,所以\B
匹配。
所以,基本上/^Klima|\bKlimaan\B/
说,“找到以 Klima 开头的字符串,或者 Klimaan 开始一个单词但不结束它的地方。
能不能用逆匹配算子啊!~
看到这个问题: Ruby 正则表达式在 Perl 中有像“!~”这样的不匹配运算符吗?
irb(main):001:0> 'keine Klima' !~ /keine Klima/
=> false
irb(main):002:0> 'kjhiasug-Klimaanlage' !~ /keine Klima/
=> true
irb(main):002:0> 'Klima' !~ /keine Klima/
=> true