我想知道是否有任何正则表达式匹配如下:
(我在示例中使用ruby。)
"nowhere".scan(/<some regex>/) #=> ["no", "now", "where", "here"]
答案 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
的单个正则表达式匹配字符串时,前一个匹配的右端必须始终位于下一个匹配的左端。