假设我有电话
“敏捷的棕色狐狸跳过了懒狗”
我想抓取“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/