Java正则表达式。获取某些KEYWORDS之间的子字符串

时间:2012-05-18 11:16:22

标签: java regex string

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

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

假设这个Delimeters表:

START | END

CAT | DOG

APPLE | ORANGE

LION | ZEBRA

PANDA | 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

输出必须是:

  1. CAT substring2 substring3 DOG
  2. APPLE substrin7 substring8 ORANGE
  3. PANDA子串11 CAT
  4. LION substring10 substring 11 ZEBRA
  5. APPLE substring15 substring16 ORANGE
  6. 我的正则表达式:

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

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

    以例如:

    CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 
    

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

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

    有什么建议吗?感谢

2 个答案:

答案 0 :(得分:2)

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

我在澄清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

答案 1 :(得分:0)

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

 "APPLE substrin7 substring8 ORANGE" 

包含在:

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

所以基本上你必须抓住猫没有跟随APPLE |橙色|狮子会| ZEBRA |熊猫|猫 因为那些会开始另一组。这可能是可能的,但编写正则表达式就像尝试用正则表达式解析HTML一样。

请参阅: RegEx match open tags except XHTML self-contained tags

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

以下是我想要处理前两个起始结束组合的示例。

(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)

所以你可以看到它是否有更多的组合它只是非常冗长。