【问题标题】:Regex optional parantheses into forced three groups正则表达式可选括号分成强制三组
【发布时间】:2019-08-31 08:21:01
【问题描述】:

我有一串这样的括号:

(this) (should) (be) (group) (one) (thisshouldbegrouptwo) (this) (should) (be) (group) (three)

我想将这个正则表达式分成三组,用常量字符串thisshouldbegrouptwo,可选地在括号中,分隔组:

1. Group: (this) (should) (be) (group) (one)
2. Group: (thisshouldbegrouptwo)
3. Group: (this) (should) (be) (group) (three)

字符串(thisshouldbegrouptwo) 是一个固定的可选字符串,其括号也是可选的。如果它不存在,我希望得到以下结果:

1. Group: (this) (should) (be) (group) (one)
2. Group: 
3. Group: (this) (should) (be) (group) (three)

在这种情况下,如果整个字符串匹配在一个组中也是可以的。

第 1 组或第 3 组的括号数量不重要,只有中间组周围的括号很重要,如果找到则应与中间组一起,而不是与边缘组。

这是我目前为止的正则表达式 (demo):

(\(.*\))?(?:\s(\(thisshouldbegrouptwo\)\s))?(\(.*\))

【问题讨论】:

  • 你能更好地解释一下你的实际需求吗?你怎么知道这些组是什么?其中的具体文字?空格的存在与否?如所问,我们真的没有足够的工作,而且你的演示并没有真正的帮助。也许您可以说明您的演示没有按照您的意愿进行操作?在问题本身中提供您正在处理的正则表达式也是一种很好的做法,而不仅仅是在演示链接中。
  • 第一组应该是 (thisshouldbegrouptwo) 之前的所有内容,第二组应该是 (thisshouldbegrouptwo) 本身,第三组应该是 (thisshouldbegrouptwo) 之后的所有内容。问题是,不能保证在之前或之后(这应该是grouptwo)。但我必须确保匹配的组始终相同。
  • 根据该描述,(.*)(\(?thisshouldbegrouptwo\)?)(.*) 可以。我怀疑你有更多的要求。除非您告诉我们这还不够,否则我们无法为您提供帮助。
  • 对不起,由于我的英语口语知识有限,很难描述。
  • 这个例子确实有效,同时也存在 long (thisshouldbegrouptwo)。但可能存在这样的情况,即字符串中不存在该字符串。然后我需要匹配一组中的完整全线。在本例中,这将导致不匹配。

标签: regex parentheses


【解决方案1】:

这个正则表达式会做你想做的事:

(.*?)(\(?thisshouldbegrouptwo\)?)(.*)|(.*)

thisshouldbegrouptwo 出现在字符串中时,组 1 和组 3 将具有左右上下文,不包括可能围绕组 2 的可选括号。

当字符串中不存在该文本时,第 4 组将包含整个字符串。

解决方案的关键要素:

  • 首先使用非贪婪表达式 .*? 而不是 .*,避免将第 2 组的左括号集中到第 1 组中。
  • 末尾的|(.*) 是一个包罗万象的内容,但由于正则表达式是从左到右处理的,因此当出现第二组字符串时,您将获得匹配的第一部分。

我找不到将不匹配的情况分成两组的解决方案,因为在那种情况下没有什么可以将它们分开的,但是既然你说可以保持在一起,把它移到第 4 组表达式确实应该适合你。

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多