Haystack:
The quick red fox jumped over the lazy brown dog
Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z
这将匹配除z之外的任何内容,因此恰好在下一个z之前停止。 所以.*?quick[^z]*将与The quick fox jumps over the la匹配。 但是,只要您有多个简单的字母需要注意,就可以使用(?:(?!X).)*,例如 (?:(?!lazy).)*-匹配单词lazy之前的任何内容。 这是使用**lookahead assertion**,更具体地说是使用负前瞻。 .*?quick(?:(?!lazy).)*将与The quick fox jumps over the匹配。
说明:
(?: # Match the following but do not capture it:
(?!lazy) # (first assert that it's not possible to match "lazy" here
. # then match any character
)* # end of group, zero or more repetitions.
const string text = "The quick red fox jumped over the lazy brown dogz";
string lazy = new Regex(".*?quick.*?(?=z)").Match(text).Value;
Console.WriteLine(lazy); // The quick red fox jumped over the la
string greedy = new Regex(".*?quick.*(?=z)").Match(text).Value;
Console.WriteLine(greedy); // The quick red fox jumped over the lazy brown dog
3条答案
按热度按时间bkhjykvo1#
“搜索到
X
但不包括X
“的明确表述方式是:其中
X
可以是任何正则表达式。不过,在您的情况下,这可能有些矫枉过正-最简单的方法是
这将匹配除
z
之外的任何内容,因此恰好在下一个z
之前停止。所以
.*?quick[^z]*
将与The quick fox jumps over the la
匹配。但是,只要您有多个简单的字母需要注意,就可以使用
(?:(?!X).)*
,例如(?:(?!lazy).)*
-匹配单词lazy
之前的任何内容。这是使用**lookahead assertion**,更具体地说是使用负前瞻。
.*?quick(?:(?!lazy).)*
将与The quick fox jumps over the
匹配。说明:
此外,在搜索关键字时,您可能希望用单词边界锚点将其包围起来:
\bfox\b
将仅匹配完整的字fox
,而不匹配foxy
中的fox。备注
如果要匹配的文本也可以包含换行符,那么你需要设置正则表达式引擎的“dot matches all”选项。通常,你可以通过在正则表达式前面添加
(?s)
来实现这一点,但是这并不是在所有正则表达式引擎中都有效(特别是JavaScript)。替代解决方案:
在许多情况下,您也可以使用更简单、更易读的解决方案,即使用惰性量词。通过将
?
添加到*
量词,它将尝试从当前位置匹配尽可能少的字符:将匹配任意数量的字符,在
X
(可以是任何正则表达式)或字符串末尾(如果X
不匹配)之前停止。您可能还需要设置“dot matches all”选项才能使其生效。(注意:我在X
周围添加了一个非捕获组,以便可靠地将其与交替隔离)gojuced72#
lookahead正则表达式语法可以帮助您实现目标。
在
(?=z)
lookahead之前注意到.*?
延迟匹配是很重要的:表达式匹配子字符串,直到第一次出现z
字母。下面是C#代码示例:
f0brbegy3#
试试这个