代码之家  ›  专栏  ›  技术社区  ›  cryptic_star

正则表达式中的嵌套组

  •  1
  • cryptic_star  · 技术社区  · 15 年前

    我正在构造一个正在寻找日期的正则表达式。我想退回找到的日期和句子。在下面的代码中,日期字符串两边的字符串应该检查句子的条件。为了你的缘故,我省略了日期字符串的正则表达式——可以说,它可以用来挑选日期。虽然date_字符串的内部并不重要,但它被分组为一个完整的regex。

    "((?:[^.|?|!]*)"+date_string+"(?:[^.|?|!]*[.|?|!]\s*))"
    

    问题是date_字符串只匹配任何给定日期的最后一个数字,可能是因为date_字符串前面的regex匹配得太远,超出了date regex。例如,如果我说“独立日是7月4日”,我会得到句子和4,即使它应该匹配“7月4日”。如果你想知道的话,我的regex inside date_字符串的排序方式应该是'july 4'首先匹配。有没有办法在一个regex中完成这一切?或者我需要以某种方式将其拆分(即将所有文本拆分成句子,然后检查每个句子)?

    2 回复  |  直到 15 年前
        1
  •  2
  •   tiftik    15 年前

    通过添加问号,可以使重复运算符不贪婪。如果是你的话

    [^.?!]*?
    

    是的,把文本分成句子(最好不包括最后一个字符)会让它变得更容易。

    (好像我没看角色课上的内容。换成了特洛夫林的。)

        2
  •  3
  •   Tomalak    15 年前

    你的正则表达式有几个问题。

    1. 字符类中没有替换。你想要 [^.?!] 不是 [^.|?|!] .
    2. 你不需要非捕获组 完全 .
    3. 你可能不需要 任何 “外部”分组,因为 整场比赛 是你要找的。
    4. 日期之前的匹配部分是贪婪的,不应该是贪婪的(这超出了日期的一部分)。
    5. 你假设一个句子与现实不符。你自己的例子证明了这一点,如果你尝试的话。

    暂且不谈最后一点,你最终会得到这样一个版本:

    [^.?!]*?(July 4)[^.?!]*[.?!]\s*
    

    其中文字 July 4 代表你的约会规则。这与您的问题文本匹配:

    1. ' For example, if I say "Independence Day is July 4.'
    2. '", I will get the sentence and 4, even though it should match 'July 4'. '

    这几乎证明了我的观点。