【问题标题】:Is it possible to write Regular expression that match "nowhere" with ["no","now", "where","here"]是否可以用 ["no","now", "where","here"] 编写匹配“nowhere”的正则表达式
【发布时间】:2015-08-02 18:14:11
【问题描述】:

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

(我在示例中使用了 ruby​​。)

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

【问题讨论】:

  • ere,re,e 怎么样?
  • 您需要一个算法来枚举所有可能的子字符串并检查它是否在您的已知单词字典中。喜欢dict = %w[no now where here her]; matches = []; s = "nowhere"; (1..s.size).each do |l| s.chars.each_cons(l) do |sub| matches &lt;&lt; sub.join if dict.include? sub.join end end; matches。或者反过来做,在字符串中搜索字典中的每个单词。

标签: ruby regex


【解决方案1】:

捕获您想要的内容的正则表达式是/(?=(now))(no)(w(here))/

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

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

我可能是错的,但是如果你想用正则表达式来做,我建议不这样做。还有其他方法可以做到这一点。

【讨论】:

    【解决方案2】:

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

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

    对于单词列表,这里是一个存储库https://github.com/atebits/Words/blob/master/Words/en.txt(信用: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"]
    

    只要您有每种语言的单词列表,您就可以将此策略用于多种语言。

    【讨论】:

      【解决方案3】:

      不,没有。假设存在这样的正则表达式。当它匹配"no" 时,最后匹配位置移动到"o""w" 之间的位置。然后可以匹配"w"(并让"no" 成为回溯),但"no" 不会被包含在匹配中。

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

      【讨论】:

      • 不正确。您只需使用嵌套在捕获中的多个捕获即可轻松重叠捕获,请阅读我的答案。
      • @Flipybitz 你错了。由于scan,使用多个捕获不会给出平面数组。
      • 我发布了我的答案,它返回了 OP 想要的内容。我不确定你在说什么。
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2018-04-28
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多