正则表达式中的嵌套组

时间:2010-04-14 21:05:01

标签: regex nested

我正在构建正在寻找日期的正则表达式。我想返回找到的日期和找到的句子。在下面的代码中,date_string两侧的字符串应该检查句子的条件。为了你的缘故,我省略了date_string的正则表达式 - 足以说明,它适用于挑选日期。虽然date_string的内部并不重要,但它被分组为一个完整的正则表达式。

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

问题是date_string只匹配任何给定日期的最后一个数字,可能是因为date_string前面的正则表达式匹配得太远而且超出了日期正则表达式。例如,如果我说“独立日是7月4日”,即使它与“7月4日”匹配,我也会得到4和4的句子。如果您想知道,我的dategetring里面的正则表达式的排序方式是'7月4'应该首先匹配。有没有办法在一个正则表达式中完成所有这些操作?或者我是否需要以某种方式将其拆分(即将所有文本拆分成句子,然后检查每个句子)?

2 个答案:

答案 0 :(得分:3)

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

  1. 字符类没有替换。您想要[^.?!],而不是[^.|?|!]
  2. 您根本不需要非捕获组
  3. 您可能不需要任何“外部”分组,因为整个匹配就是您所寻找的。
  4. 你在日期之前的比赛部分是贪婪的,不应该是(这是你日期的一部分)。
  5. 你假设什么类似于与现实不符的句子。你自己的例子证明,如果你尝试。
  6. 暂时搁置最后一点,你最终会得到这个版本:

    [^.?!]*?(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'. '
    3. 这几乎证明了我的观点#5。

答案 1 :(得分:2)

您可以通过添加问号使重复操作符非贪婪。在你的情况下,它将是

[^.?!]*?

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

(好像我没看过角色类中的内容。用tloflin替换它。)