是否可以编写匹配"无处的正则表达式" [" no"," now"," where"," here"]

时间:2015-08-02 08:54:12

标签: ruby regex

我想知道是否有任何正则表达式匹配如下:

(我在示例中使用ruby。)

"nowhere".scan(/<some regex>/) #=> ["no", "now", "where", "here"]

3 个答案:

答案 0 :(得分:0)

捕获所需内容的正则表达式为/(?=(now))(no)(w(here))/

这将返回["now", "no", "where", "here"]而不是["no", "now", "where", "here"](“现在”和“否”反向)但不幸的是,这是您可以获得的最接近的。不能按顺序捕获它们。

如果你想知道如何匹配其他单词中的正常英语单词,那么纯正则表达式是不可能的。您必须遍历整个字典并检查测试单词中是否有任何单词实例。这简直不可行。

我可能是错的,但如果你想用正则表达式做,我会建议不然。还有其他方法可以实现这一目标。

答案 1 :(得分:0)

正则表达式不知道给定字符串的语义是什么。因此,我们需要以不同的方式解决问题。策略是:

  • 找出可能的单词
  • 将可能的单词与单词列表中的单词进行比较(本例中为英语)

对于单词列表,这是一个存储库https://github.com/atebits/Words/blob/master/Words/en.txt(credit:https://stackoverflow.com/a/3480849/630654

words = File.read("en.txt").split("\n")

所以,现在我们需要弄清楚可能的词是什么:

str = "nowhere"
possible_words = (0..str.length).to_a.combination(2).map{|i,j| str[i...j]}
# => ["n", "no", "now", "nowh", "nowhe", "nowher", "nowhere", "o", "ow", "owh", "owhe", "owher", "owhere", "w", "wh", "whe", "wher", "where", "h", "he", "her", "here", "e", "er", "ere", "r", "re", "e"]

(信用:https://stackoverflow.com/a/3457718/630654

现在让我们过滤掉实际上可能出现的单词:

actual_words = possible_words.select {|w| words.include? w}
#=> ["no", "now", "nowhere", "ow", "where", "he", "her", "here", "er", "ere", "re"]

如果您有每种语言的单词列表,则可以将此策略用于各种语言。

答案 2 :(得分:-1)

不,没有。假设存在这样的正则表达式。如果匹配"no",则最后一个匹配位置会移至"o""w"之间的位置。然后可以匹配"w"(并且"no"是一个回顾),但"no"不会作为匹配的一部分包含在内。

当您使用scan的单个正则表达式匹配字符串时,前一个匹配的右端必须始终位于下一个匹配的左端