正则表达式直到但不包括

时间:2010-10-03 14:08:06

标签: regex search regex-lookarounds

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

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

3 个答案:

答案 0 :(得分:134)

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

(?:(?!X).)*

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

在你的情况下,这可能是过度的 - 这里最简单的方法是

[^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.

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

注意

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

替代解决方案:

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

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

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

答案 1 :(得分:9)

lookahead regex syntax可以帮助您实现目标。因此,你的例子的正则表达式是

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

.*?前瞻之前注意(?=z)延迟匹配非常重要:表达式匹配子字符串,直到{{1>出现第一次信。

这是C#代码示例:

z

答案 2 :(得分:0)

试试这个

(.*?quick.*?)z