匹配行没有出现带有正则表达式的关键字

时间:2013-08-21 13:18:46

标签: ruby regex

以下是我想在Ruby中与Regex匹配的行:

Klima
kjhiasug-Klimaanlage

这是我不想匹配的那个:

keine Klima

为此,我需要一个完全正确的正则表达式。我试过

(?!keine)\s?Klima

但它似乎不起作用。

有关如何解决该问题的任何建议吗?

3 个答案:

答案 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