实施例。 string1 string2 content abc
我想从上面的内容中选择content abc
,我已经使用了
(?< = string1(string2))。*
但有时string2不会出现在整个内容中。我用过这个
(小于?=字符串1)。*
内容可能是随机出现的,如果string2来了,我还需要一个正则表达式才能进行内容播放。 我试过这个不工作
(?< = string1(string2))。* |(?< = string1)。*
答案 0 :(得分:1)
使用Java变量lookbehinds你可以做到这一点,你不应该尝试不支持Java的在线正则表达式测试器:
(?<=\bstring2\b|\bstring1\b(?!.{0,999999}\bstring2\b)).*
单词的顺序很重要。这匹配以下字符串:
string1 string2 abc
^^^^
string1 abc
^^^^
string2 abc
^^^^
注意:如果您不想与后者匹配,可以使用@Wiktor's answer。
故障:
(?<=
开始积极的观察
\bstring2\b
匹配单词string2
|
或\bstring1\b
匹配单词string1
(?!.{0,999999}\bstring2\b)
这不在单词string2
)
PL结束.*
匹配到行尾答案 1 :(得分:1)
您的(?<=string1( string2)).*|(?<=string1).*
无法正确匹配string1 string2 content abc
字符串,因为引擎在从左到右分析字符串时会将string1
后的位置与第二个替代字符匹配({{1 }})。
您可能使用的正则表达式是
(?<=string1).*
请参阅regex demo。
<强>详情
(?<=string1(?! string2)|string1 string2).*
- 是一个积极的外观,需要(?<=string1(?! string2)|string1 string2)
没有后跟空格string1
或string2
string1 string2
- 匹配除了换行符之外的0 +字符。如果您计划匹配整个单词,请使用.*
单词边界围绕\b
(请记住在Java字符串文字中加倍反斜杠)。