以下是我想在Ruby中与Regex匹配的行:
Klima
kjhiasug-Klimaanlage
这是我不想匹配的那个:
keine Klima
为此,我需要一个完全正确的正则表达式。我试过
(?!keine)\s?Klima
但它似乎不起作用。
有关如何解决该问题的任何建议吗?
答案 0 :(得分:2)
r = /(?<!keine )Klima/
r =~ "Klima" # => match
r =~ "kjhiasug-Klimaanlage" # => match
r =~ "keine Klima" # => no match
答案 1 :(得分:1)
我会使用类似的东西:
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开始一个单词但不结束它的字符串。
答案 2 :(得分:0)
你能使用逆匹配算子!〜
请参阅此问题: Does Ruby regular expression have a not match operator like "!~" in 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