RegEx在两个特定字符串之间抓取文本

时间:2015-11-16 13:08:39

标签: regex string match

说我有线

"快速的棕色狐狸跳过懒狗"

我想抓住" brown"之间的所有东西。和" over",其中边界词也可以是其他词的子串。所以我试图告诉RegEx类似

"从字符串brown开始抓取此行中的所有内容,直到找到字符串over"

所以我做了

brown[^("over")]*

但结果是brown f,因为" fox"包含" o"它包含在" over"。

我无法找到解决方案,所以我希望你能提供帮助。

1 个答案:

答案 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
  • 以外的0个或多个字符
  • (?:o(?!ver\b)[^o]*)* - 0个或更多o序列,后面没有ver(?!ver\b)),后面跟着o以外的0个或更多字符([^o]*
  • \bover\b - 匹配整个单词over