94

对于正则表达式,搜索直到但不包括的语法是什么?有点像:

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
4

3 回答 3

186

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

(?:(?!X).)*

whereX可以是任何正则表达式。

但是,在您的情况下,这可能有点矫枉过正-这里最简单的方法是

[^z]*

这将匹配任何内容z,因此在下一个之前停止z

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

但是,一旦您有不止一个简单的字母需要注意,(?:(?!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.

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

笔记

如果要匹配的文本也可以包含换行符,则需要设置正则表达式引擎的“点匹配所有”选项。通常,您可以通过添加(?s)到正则表达式来实现,但这并不适用于所有正则表达式引擎(尤其是 JavaScript)。

替代解决方案:

在许多情况下,您还可以使用使用惰性量词的更简单、更易读的解决方案。通过将 a 添加?*量词中,它将尝试从当前位置匹配尽可能少的字符:

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

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

于 2010-10-03T14:12:24.613 回答
19

前瞻正则表达式语法可以帮助您实现目标。因此,您的示例的正则表达式是

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

重要的是要注意前瞻.*?之前的惰性匹配:表达式匹配子字符串,直到第一次出现该字母。(?=z)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
于 2014-04-22T04:59:23.233 回答
0

试试这个

(.*?quick.*?)z
于 2010-10-03T14:13:19.480 回答