【问题标题】:Regex to match second word or the first occurance of the another word正则表达式匹配另一个单词第一次出现的第二个单词
【发布时间】:2014-08-19 10:53:22
【问题描述】:

我遇到需要解析以下内容的情况

Some Text
Some Text
SUB-TOTAL          :    $0.90 
Some Text          :    $0.79-
SUB-TOTAL          :    $0.11 
TAX                :    $0.05 
TOTAL      $0.16 

如果Tax 不存在,我需要解析到最后一个'SUB-TOTAL',否则它必须解析到TAX 我不确定我在正则表达式中哪里做错了 * .?(?=(TAX|(SUB-TOTAL.?SUB-TOTAL))) * 由于对正则表达式的经验较少。谁能帮帮我。

提前致谢。

【问题讨论】:

  • 您的正则表达式搜索任何单个字符 .?,后跟字符串 TAXSUB-TOTAL-one-optional-character-SUB-TOTAL。现在你没有第二个版本,所以它基本上会在TAX这个词之前返回换行符! .* 为您提供任意数量的任意字符,?: 是非捕获组(?= 是前瞻。)
  • 这可能是对您的需求的误解,但是如果适当的代码是可修改的,那么最好的设计是按原样解析文本,然后放置忽略税收的逻辑在解析之后

标签: java javascript regex


【解决方案1】:

要了解并包含 SUB-TOTAL 或 TAX 的值,您可以使用:.*(?:(?:SUB-TOTAL|TAX)[^\n]*)... 这是正确的分界点吗?

编辑好的 - 让我头疼...但是如果存在最后一个 SUB-TOTAL,否则是 TAX:

^(?:(?:(?!.*SUB-TOTAL.*).*TAX[^\n]*)|(?:.*SUB-TOTAL[^\n]*))

希望这适用于您的正则表达式引擎!

EDIT2此版本不返回 SUB-TOTAL/TAX 行

^(?:(?:(?!.*SUB-TOTAL.*).*(?=TAX))|(?:.*(?=SUB-TOTAL)))

【讨论】:

  • 船长,感谢您的快速回复。在某些情况下,我们将有两个“SUB-TOTAL”,在这种情况下它应该与第二个“SUB-TOTAL”匹配。在某些情况下,我们将有一个“SUB-TOTAL”,它应该与第一个匹配,还有一个情况,在这种情况下,我们不会有“SUB-TOTAL”,它应该匹配到“TAX”
  • 嗨@user_in,正则表达式通常是贪婪的......所以这将从包含最后一次出现的SUB-TOTAL或TAX的行的开头到结尾匹配。
  • 嗨@Captain,是的,给定的问题是贪婪和非贪婪的混合。我们有什么方法可以在正则表达式中实现这一点?
  • 对不起 - 我很困惑...你说最后 SUB-TOTAL 或 TAX... SUB-TOTAL 之后的 TAX 是否像示例中一样?那么这个答案就是给你的。
  • 嗨@Captain,是的,“TAX”总是在“SUB-TOTAL”之后。 'TAX' 将始终出现在内容中。 'SUB-TOTAL' 是可选的,如果存在,它将是一次,在某些情况下,它存在两次(如上例所示)。我正在寻找的是 Case-1:只有一个“SUB-TOTAL”存在,它必须只匹配那个并忽略“TAX”。情况 2:如果存在两个“SUB-TOTAL”,则必须匹配第二个,并忽略第一个“SUB-TOTAL”和“TAX”。案例 3:如果只有 'TAX' 存在,它必须匹配 'TAX'
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多