说我有线
"快速的棕色狐狸跳过懒狗"
我想抓住" brown"之间的所有东西。和" over",其中边界词也可以是其他词的子串。所以我试图告诉RegEx类似
"从字符串brown
开始抓取此行中的所有内容,直到找到字符串over
"
所以我做了
brown[^("over")]*
但结果是brown f
,因为" fox"包含" o"它包含在" over"。
我无法找到解决方案,所以我希望你能提供帮助。
答案 0 :(得分:2)
Alroght,要在两个子串之间匹配真正的任何(尾随部分必须是最左边的匹配,即最接近前导子串),可以在展开的帮助下最好地实现 - - 循环方法,它使用否定的字符类(有时候,使用预测)。
以下是您的案例:
\bbrown\b[^o]*(?:o(?!ver\b)[^o]*)*\bover\b
请参阅regex demo
请注意,基本上此表达式与(?s)\bbrown\b.*?\bover\b
同义,其中 .*?
匹配 0或更多任何字符,但尽可能少返回有效匹配< / em>的。但是,它涉及的回溯要少得多,因为它是线性。
此处展开的延迟匹配变为[^o]*(?:o(?!ver\b)[^o]*)*
。否定字符类[^o]
匹配除o
之外的任何字符。因此,我们不必担心匹配换行符。
\b
字边界仅帮助匹配整个单词。 如果您不需要全文匹配,只需从模式中删除所有\b
。
这是我的正则表达式细分:
\bbrown\b
- 将brown
作为一个整体匹配[^o]*
- 除o
(?:o(?!ver\b)[^o]*)*
- 0个或更多o
序列,后面没有ver
((?!ver\b)
),后面跟着o
以外的0个或更多字符([^o]*
)\bover\b
- 匹配整个单词over
。