Regex 两个特定字符串之间的正则表达式抓取文本
说我有电话 “敏捷的棕色狐狸跳过了懒狗” 我想抓住“brown”和“over”之间的所有词,其中边界词也可能是其他词的子串。所以我想告诉正则表达式类似的东西 “从字符串Regex 两个特定字符串之间的正则表达式抓取文本,regex,string,match,Regex,String,Match,说我有电话 “敏捷的棕色狐狸跳过了懒狗” 我想抓住“brown”和“over”之间的所有词,其中边界词也可能是其他词的子串。所以我想告诉正则表达式类似的东西 “从字符串brown开始抓取此行中的所有内容,直到找到字符串为止” 所以我做了 brown[^(“over”)]* 但是结果是棕色f,因为“fox”包含一个“o”,它包含在“over”中 我只是找不到解决这个问题的方法,所以我希望你能提供帮助。Alroght,要真正匹配两个子字符串之间的任何内容(其中尾随部分必须是最左边的匹配,即最接近前导
brown
开始抓取此行中的所有内容,直到找到字符串为止
”
所以我做了
brown[^(“over”)]*
但是结果是棕色f
,因为“fox”包含一个“o”,它包含在“over”中
我只是找不到解决这个问题的方法,所以我希望你能提供帮助。Alroght,要真正匹配两个子字符串之间的任何内容(其中尾随部分必须是最左边的匹配,即最接近前导子字符串),可以通过使用求反字符类的展开循环方法来实现(有时,向前看)
以下是一个关于您的案例:
\bbrown\b[^o]*(?:o(?!ver\b)[^o]*)*\bover\b
见
请注意,此表达式基本上与(?s)\bbrown\b.*\b上面的\b
同义,其中*?
匹配0个或多个任意字符,但返回有效匹配的字符数尽可能少。但是,由于它是线性的,因此涉及的回溯要少得多
展开的惰性匹配在这里变成[^o]*(?:o(?!ver\b)[^o]*)*
。求反字符类[^o]
匹配任何字符,但o
。因此,我们不必担心匹配换行符
\b
单词边界仅帮助匹配整个单词。如果不需要匹配整个单词,只需从模式中删除所有\b
。
这是我的正则表达式分类:
-将\bbrown\b
作为一个整体匹配brown
-0个或更多字符,而不是[^o]*
o
-0个或多个(?:o(?!ver\b)[^o]*)*
序列,后面不跟o
(ver
),后面跟0个或多个字符,而不是(?!ver\b)
(o
)[^o]*
-匹配整个单词\bover\b
为止
?如何“从字符串开始抓取这行中的所有内容,直到找到字符串为止”
?直到找到字符串为止或直到找到字符串为止。换行如何?@stribizev,第一个“结束”。可能我应该提到,在我的例子中,brown
和over
也可能是其他单词的子字符串,或者用引号括起来,因此在这里使用单词边界系列对分析字符串的允许模式有一定的限制。是的,您可以删除它们,并且可以将它们作为其他单词的一部分进行匹配。此正则表达式的速度有时比使用*?
时快100倍(取决于输入字符串的长度)。此外,此技术是通用的,可移植到大多数其他平台。使用*?
时,您可能会遇到各种各样的难题,如单线模式不可用(在JS中)或回溯缓冲区限制很快耗尽(输入非常长)。上面的模式如何比brown\b((?!over.*)更有效\bover
?@hjpotter92:查找匹配需要58个步骤。查找匹配需要23-25个步骤。您可以检查regex调试器,看看回溯在这两种情况下是如何工作的。点匹配的效率总是比字符类匹配低。尽管这是针对PCRE的,.NET regex引擎将与这些模式类似。