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



假设我有行

"敏捷的棕色狐狸跳过懒狗"

我想抓住"brown"one_answers"over"之间的所有单词,其中的边界词也可能是其他单词的子串。所以我想告诉RegEx一些类似的事情

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

所以我做了

brown[^("over")]*

但结果是brown f,因为"fox"包含一个包含在"over"中的"o"。

我只是找不到解决这个问题的办法,所以我希望你能帮忙。

Alroght,要真正匹配两个子串之间的任何(尾部必须是最左边的匹配,即最靠近前导子串),最好借助于展开循环方法,该方法允许使用否定字符类(有时,向前看)。

以下是您的案例:

bbrownb[^o]*(?:o(?!verb)[^o]*)*boverb

查看regex演示

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

展开的懒惰匹配在这里被转换为[^o]*(?:o(?!verb)[^o]*)*。否定字符类[^o]匹配除o之外的任何字符。因此,我们不必担心匹配换行符。

b单词边界只帮助匹配整个单词如果不需要全词匹配,只需从模式中删除所有b即可

以下是我的正则表达式分解:

  • bbrownb-将brown作为一个完整单词进行匹配
  • [^o]*-除o之外的0个或更多字符
  • (?:o(?!verb)[^o]*)*-不跟ver(?!verb))且跟有0个或多个除o[^o]*)之外的字符的o的0个或更多序列
  • boverb-匹配一个完整的单词over

最新更新