【问题标题】:Regex returning different result on same input正则表达式在相同的输入上返回不同的结果
【发布时间】:2017-11-08 15:10:37
【问题描述】:

我正在检查一些结果并从文档中传递两个输入,两个输入看起来相同,但为什么它们返回不同的输出。 我的正则表达式是

(?<preandconjunct>(?:\b([Ss]ubsection|[Ss]ection|[Aa]rticle) +)(?<conjunct>(?:(?<level>(?:(?:[IVXivx]{1,5}(?![A-Z]))|(?:[A-Z]{1,2}(?![A-Z]))|(?:[0-9]+)))|(?<level>\((?:(?:[IVXivx]{1,5}(?![A-Z]))|(?:[A-Z]{1,2}(?![A-Z]))|(?:(?!in|or|if|of|to|as|at|it|no|an)[a-z]{1,2}(?![a-z]))|(?:[0-9]+))\))|(?<level>[\.-](?:(?:[IVXivx]{1,5}(?![A-Z]))|(?:[A-Z]{1,2}(?![A-Z]))|(?:[0-9]+))))+)(?=$|[ ,;.)]))

两个输入是

第 3.1 条(应仅受第 3.1 条管辖)或第 11.3(b) 条规定的争议,第 XI 条和第 XII 条的赔偿条款是唯一和排他的补救措施根据本协议或与本协议所设想的交易有关的各方。在法律允许的最大范围内和之后,除基于故意欺诈的索赔外,第 3.1 条下的争议(应仅受第 3.1 条管辖),

第 3.1 条(应仅受第 3.1 条管辖)或第 11.3(b) 条规定的争议,第 XI 条和第 XII 条的赔偿条款是唯一和排他的补救措施根据本协议或与本协议所设想的交易有关的各方。在法律允许的最大范围内,在法律允许的最大范围内,除基于故意欺诈的索赔外,第 3.1 条下的争议(应仅受第 3.1 条管辖),

我也期待

第 3.1 节

第 3.1 节

第 11.3(b) 节

第十一条

第十二条

第 3.1 节

第 3.1 节

最后一个没有出现在第一个输入中。

【问题讨论】:

  • 看,it matches well(在regexstorm.net/tester获得相同的结果)。
  • 所以你基本上是在问这两个文本之间有什么区别?答案是,没有。
  • 好吧,如果他们为同一个正则表达式返回不同的输出 - 它们是不一样的。检查空格的差异,也许是一些不可见的字符等等。
  • 是的,你们是对的。我有十进制字符 160 而不是 32。我怎样才能捕获各种空格,例如 \s 没有捕获 160(十六进制中的 \u00A0)。
  • ^^^ 是的,所以它是一个不可打印的字符。去搞清楚。我建议您编辑您的问题,以解释真正的问题。

标签: c# regex


【解决方案1】:

最后一个没有出现在第一个输入中

获取所有字符的一种方法是消耗一个锚字符。以文本blah blah Section 3.1 (governed by Section 3.1) 为例。我们有三个锚点,Section()。让我们根据这些文字锚创建一个模式。

我现在将评论我的正则表达式 pattern,它需要 IgnorePattnerWhiteSpace 在正则表达式解析器中正常工作。

(((Sub)?Section)|Article)\s+    # Anchor of Section or Article or Subsection
(?<Number>[^\s]+)               # Number involved
\s+
   \(                           # Anchor of '('
      (?<Conjuct>[^)]+)         # Consume til next anchor
   \)                           # ')' anchor.

通过使用 Not 集合 [^ ],我们可以使用任何 not 结尾 ) 锚点的时髦字符。我们的匹配结果是这样的

为什么它们返回不同的输出。

您需要通过查看前面提到的文字锚点来降低捕获的复杂性。甚至可以通过首先创建文本的一般标记并在第二次正则表达式传递时从标记中提取特定项目来执行两次传递正则表达式?

也像我一样评论你的模式并处理它的单个部分,一旦单个项目工作,将整个模式组合在一起。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2021-08-15
    • 2016-01-09
    • 2015-06-12
    • 1970-01-01
    • 2019-08-28
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多