【问题标题】:Regex match non-greedy with optional end正则表达式匹配非贪婪与可选结束
【发布时间】:2017-04-03 17:43:34
【问题描述】:
TYPE1: Name Potential (parenthesis) (POSITION1)
TYPE2: Name (POSITION2)
TYPE3: Name with no Position

我正在尝试提取 3 件事。 TYPENAMEPOSITION。该职位是可选的。名称可以有括号。 我尝试了很多正则表达式,但不知道如何做到不贪心但仍然包含名称的括号。

这些应该是我的最后一组

  • TYPE1,名称电位(括号),POSITION1
  • TYPE2、名称、POSITION2
  • TYPE3,名称

这个与第一个不匹配:
(?<TYPE>.*?):\s*(?<NAME>[^(]*)\s*(?:\((?<POSITION>.*?)\))?

这太贪心了,我不提取位置:
(?<TYPE>.*?):\s*(?<NAME>.*)\s*(?:\((?<POSITION>.*?)\))?

【问题讨论】:

  • 你卡在哪里了?请发布您的模式并解释它有什么问题。
  • 给你...我已经添加了。
  • type 总是只有一个词吗?
  • 是的。其次是:
  • POSITION也可以有括号吗?

标签: regex regex-negation


【解决方案1】:

您可以将此正则表达式与最后一组用作可选匹配:

^(?<TYPE>[^:]+):\h*(?<NAME>.+?)(?:\h+\((?<POSITION>[^)]+)\))?$

RegEx Demo

如果您的正则表达式风格不支持\h(水平空格),请改用[ \t]

【讨论】:

  • 这很好用。直到我发现 NAME 可以为空。我已经更新了一点我的正则表达式,但我基于你的!谢谢你。 ^(?&lt;TYPE&gt;[^:]+):[ \t]*(?&lt;NAME&gt;(?!\().*?)(?:[ \t]*\((?&lt;POSITION&gt;[^)]+)\))?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多