正则表达式抓取两个特定字符串之间的文本

标签 regex string match

假设我有电话

“敏捷的棕色狐狸跳过了懒狗”

我想抓取“brown”和“over”之间的所有内容,其中边界词也可能是其他词的子串。所以我试图告诉正则表达式类似的事情

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

所以我就这么做了

棕色[^("over")]*

但结果是brown f,因为“fox”包含“o”,而“o”又包含在“over”中。

我只是找不到解决方案,所以我希望你能提供帮助。

最佳答案

好吧,要真正匹配两个子字符串之间的任何内容(其中尾随部分必须是最左边的匹配,即最接近前导子字符串),可以在展开的帮助下最好地实现-循环方法,涉及使用否定字符类(有时,具有前瞻功能)。

以下是适合您情况的一个:

\bbrown\b[^o]*(?:o(?!ver\b)[^o]*)*\bover\b

请参阅regex demo

请注意,基本上这个表达式与 (?s)\bbrown\b.*?\bover\b 同义,其中 .*? 匹配 0 个或更多任意字符,但尽可能少地返回有效匹配。然而,它涉及的回溯要少得多,因为它是线性的。

展开的惰性匹配在这里变成了 [^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

关于正则表达式抓取两个特定字符串之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736193/

相关文章:

regex - Linux 中的 sed 命令。如何用另一个字符串替换以 xxx 开头并以 yyy 结尾的字符

java - 如何在java正则表达式中正确使用反向引用?

c++ - 如何将整数 push_back 为字符串?

linked-list - Ocaml双链表: remove a node satisfying a condition from a double linked list

c# - 将组合框中输入的数据与数据库进行匹配

python - 从字符串列表中提取列匹配中所有匹配的更快方法

java - 用限制替换所有非数字

java - 想要将一个字符串的模式替换为使用找到的模式中的信息的字符串?

string - 将字符串拆分为字符列表的最简单方法是什么?

javascript - 用于识别 guid 或数字的正则表达式