假设我有行
"敏捷的棕色狐狸跳过懒狗"
我想抓住"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