从正则表达式解析多个组

时间:2016-09-04 20:04:23

标签: regex pcre

我在从上传到rubular的以下正则表达式解析某些字段时遇到问题。我正在解析的字符串是来自FTP服务器横幅的特殊标题。为了让我处理这个横幅,行

special:pTXT1TOCAPTURE^:mTXT2TOCAPTURE^:uTXT3TOCAPTURE^

我认为:(?i)^special(:[pmu](.*?)\^)?*可以做到这一点,但不幸的是,这只给了我最后一场比赛,我不知道为什么我懒得试图抓住每一组。另请注意,我也应该能够捕获一个空字符串,即如果匹配字符串包含:u ^

包装单词显示隐形Ruby版本 匹配结果: 特殊:pTXT1TOMATCH ^:^ mTXT2TOMATCH:uTXT3TOMATCH ^ 匹配组:

  1. :uTXT3TOMATCH ^
  2. TXT3TOMATCH
  3. 这个想法是这条线必须从测试特别开始#39;然后是最多3个捕获组,用p,m或u分隔,直到下一个^符号。我需要捕获上面指出的文本 - 基本上我需要找到TXT1TOCAPTURE,TXT2TOCAPTURE和TXT3TOCAPTURE。这三个捕获组中至少应有一个。

    提前致谢

2 个答案:

答案 0 :(得分:1)

你的RegEx有两个问题,一个是句法问题,另一个是概念问题。

<强>句法

我们在PCRE中没有这样的修饰符?*但它在Ruby中等于*,这表示贪婪的量词。在应用于捕获组的情况下,它捕获最后一个匹配。

<强>概念

使用延迟量词.*?不会为您提供连续匹配。它立即停止发动机满意度。虽然g修饰符在下次匹配时处于启用状态,但由于在上次匹配的下一个位置没有^special,因此永远不会发生。

解决方案是使用\G令牌从上一场比赛结束时开始匹配的平均值中受益:

(?:special|(?!\A)\G):([pmu][^^]*\^)

Live demo

答案 1 :(得分:0)

您可能希望拥有\G修饰符:

(?:(?:^special:)|\G(?!\A)\^:)[pmu]([^^]+)

rubular.com上查看它。