首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Regex在某些关键字之间获取子字符串

Java Regex在某些关键字之间获取子字符串
EN

Stack Overflow用户
提问于 2012-05-18 11:16:22
回答 2查看 434关注 0票数 4

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

我有开始和结束量程的组合/集合,我需要让所有的,子字符串/开始数据之间的任何单词,直到结束。

假设这张表是“烈度表”:

START END

猫狗

苹果橙

狮子斑马

熊猫猫

样本输入:

代码语言:javascript
复制
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. 猫substring2 substring3
  2. 苹果substrin7 substring8
  3. 熊猫子串11猫
  4. 狮子substring10子串11斑马

H 114Applesubstring15 substring16橙H 215G 216

我的正则表达式:

代码语言:javascript
复制
 CAT (.)*? DOG | APPLE (.)*? ORANGE | LION (.)*? ZEBRE |  PANDA (.)*? CAT 

我有问题,处理字符串,有多次发生的其他启动速度。

举个例子:

代码语言:javascript
复制
CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

我知道它将与这只猫(.)*匹配?,但是这是错误的,因为子字符串包含一个起始参数。

我只需要一个正则表达式,这将得到所有的词之间的起始语料表,直到它的匹配的结束,如果任何时候,子字符串不包含任何出现的其他起止器。

有什么建议吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-18 11:46:36

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

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

代码语言:javascript
复制
CAT ((?!(APPLE|LION|PANA)).)*? DOG|APPLE ((?!(CAT|LION|PANDA)).)*? ORANGE|LION ((?!(CAT|APPLE|PANDA)).)*? ZEBRA|PANDA ((?!(APPLE|LION)).)*? CAT

鉴于投入:

代码语言:javascript
复制
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

相配

代码语言:javascript
复制
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所指示的以下内容不匹配

代码语言:javascript
复制
CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

也和你指出的匹配

代码语言:javascript
复制
CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG 

您说它应该与以下内容相匹配

代码语言:javascript
复制
CAT substring12 DOG

但我不认为它不应该,因为猫从上面是结束分隔符

代码语言:javascript
复制
PANDA substring11 CAT

这个正则表达式产生了nfinium的预期结果。

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

代码语言:javascript
复制
CAT | DOG
PANDA | CAT
票数 2
EN

Stack Overflow用户

发布于 2012-05-18 11:45:29

我认为这其中的关键是第二和产出:

代码语言:javascript
复制
 "APPLE substrin7 substring8 ORANGE" 

它载于:

代码语言:javascript
复制
 "CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG"

因此,最基本的是,你必须抓住猫,而不是紧随其后的苹果,橙色,狮子,狮子,斑马,熊猫,猫,因为这些会启动另一组。这是可能的,但是编写正则表达式就像尝试用regex解析HTML一样。

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

这是可以完成的,但是regex将会非常复杂,这个问题最好在代码中处理。

这里是一个我认为你想要处理前两个开始结束组合的例子。

代码语言:javascript
复制
(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)|(APPLE(?!.+(?:APPLE|LION|ZEBRA|PANDA|CAT|DOG).+ORANGE).*?ORANGE)

第一组是..。

代码语言:javascript
复制
(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)

所以你可以看到,如果这有更多的组合,它只是变得非常冗长。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10651621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档