4

我需要帮助为这个问题创建最好的正则表达式。

我有起始和结束分隔符的组合/组,我需要获取起始分隔符到结束分隔符之间的所有子字符串/任何单词。

假设这个分隔符表:

开始 | 结尾

猫 | 狗

苹果 | 橙

狮子 | 斑马

熊猫 | 猫

样本输入:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6
APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA
substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12
CAT substring13 substring14 APPLE substring15 substring 16 ORANGE

输出必须是:

  1. CAT 子字符串 2 子字符串 3 狗
  2. APPLE substrin7 substring8 ORANGE
  3. 熊猫子串 11 CAT
  4. LION substring10 substring 11 ZEBRA
  5. APPLE substring15 substring16 ORANGE

我的正则表达式:

 CAT (.)*? DOG | APPLE (.)*? ORANGE | LION (.)*? ZEBRE |  PANDA (.)*? CAT 

我在处理多次出现其他起始分隔符的字符串时遇到问题。

举个例子:

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

我知道它将与此 CAT (.)* 匹配?DOG但这是错误的,因为子字符串包含起始分隔符之一。

我只需要一个正则表达式,如果子字符串不包含任何其他起始分隔符的出现,它将获取起始分隔符与其匹配的结束分隔符之间的所有单词。

有什么建议吗?谢谢

4

2 回答 2

2

在这里帮助我们的技术称为“环视”

在澄清 nfinium 和 jsobo 的反馈后,我更新了我的答案

CAT ((?!(APPLE|LION|PANA)).)*? DOG|APPLE ((?!(CAT|LION|PANDA)).)*? ORANGE|LION ((?!(CAT|APPLE|PANDA)).)*? ZEBRA|PANDA ((?!(APPLE|LION)).)*? CAT

给定输入:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12 CAT substring13 substring14 APPLE substring15 substring 16 ORANGE  string CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG etc. CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG wordx

它匹配

CAT substring2 substring3 DOG
APPLE substring7 substring 8 ORANGE
PANDA substring11 CAT
LION substring10 substring11 ZEBRA
APPLE substring15 substring 16 ORANGE
CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG

具体来说,它不会匹配 nfinium 指示的以下内容

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

正如你指出的那样,也匹配

CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG 

你说它应该匹配以下

CAT substring12 DOG

但我认为不应该,因为上面的 CAT 是

PANDA substring11 CAT

此正则表达式产生 nfinium 的预期结果

请注意,根据 nfinium 的要求,CAT 可以是开始和结束分隔符

CAT | DOG
PANDA | CAT
于 2012-05-18T11:46:36.873 回答
0

我认为关键是第二个和输出:

 "APPLE substrin7 substring8 ORANGE" 

包含在:

 "CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG"

所以基本上你必须抓住 Cat not follow by APPLE | 橙色 | 狮子 | 斑马 | 熊猫 | CAT 因为那些会开始另一个小组。这可能是可能的,但编写一个正则表达式来做到这一点类似于尝试使用正则表达式解析 HTML。

请参阅: RegEx 匹配打开的标签,XHTML 自包含标签除外

可以做到,但正则表达式会非常复杂,这个问题最好在代码中处理......

这是我认为您想要处理前两个开始结束组合的示例。

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)|(APPLE(?!.+(?:APPLE|LION|ZEBRA|PANDA|CAT|DOG).+ORANGE).*?ORANGE)

只是第一组是...

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)

所以你可以看看这是否有更多的组合,它会变得非常冗长。

于 2012-05-18T11:45:29.813 回答