直到但不包括正则expression式

对于正则expression式search的语法是什么,但不包括? 有点像:

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 

“直到X但不包括Xsearch”的明确方式是:

 (?:(?!X).)* 

其中X可以是任何正则expression式。

就你而言,这可能是矫枉过正的 – 这里最简单的方法是

 [^z]* 

这将匹配除z以外的任何东西,因此在下一个z之前停止。

所以.*?quick[^z]*会匹配The quick fox jumps over the la .*?quick[^z]*

但是,只要你有多个简单的信件要注意, (?:(?!X).)*就会发挥作用,例如

(?:(?!lazy).)* – 匹配任何东西,直到单词lazy开头。

这是使用一个超前的断言 ,更具体地说是一个负面的超前。

.*?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. 

此外,在search关键字时,您可能希望用词边界锚将它们包围: \bfox\b只会匹配完整的单词fox而不是fox中的foxy

注意

如果要匹配的文本也可以包含换行符,则需要设置正则expression式引擎的“点匹配全部”选项。 通常,你可以通过预先考虑(?s)到正则expression式来实现,但是这在所有正则expression式引擎(特别是JavaScript)中都不起作用。

替代scheme:

在许多情况下,你也可以使用一个更简单,更可读的解决scheme,使用一个懒惰的量词。 通过添加一个?*量词,它会尝试从当前位置尽可能less地匹配字符:

 .*?(?=(?:X)|$) 

将匹配任意数量的字符,在X (可以是任何正则expression式)或string的末尾(如果X不匹配)之前停止。 您可能还需要设置“点全部匹配”选项才能使用。 (注意:我在X周围添加了一个非捕获组,以便可靠地将其与交替隔离)

一个超前的正则expression式语法可以帮助你实现你的目标。 因此,你的例子是一个正则expression式

 .*?quick.*?(?=z) 

重要的是要注意到.*? (?=z)超前之前的延迟匹配:expression式匹配子string,直到z字母的第一个出现为止。

这里是C#代码示例:

 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 

尝试这个

 (.*?quick.*?)z