1

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

Klima
kjhiasug-Klimaanlage

这是我不想匹配的一个:

keine Klima

为此,我需要一个能够做到这一点的正则表达式。我试过了

(?!keine)\s?Klima

但它似乎不起作用。

关于如何解决这个问题的任何建议?

4

3 回答 3

2
r = /(?<!keine )Klima/

r =~ "Klima"                # => match
r =~ "kjhiasug-Klimaanlage" # => match
r =~ "keine Klima"          # => no match
于 2013-08-21T13:28:33.167 回答
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 开始一个单词但不结束它的地方。

于 2013-08-21T13:52:22.287 回答
0

能不能用逆匹配算子啊!~

看到这个问题: 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
于 2013-08-21T13:23:37.313 回答