regex 正则表达式Until但不包括

ve7v8dk2  于 2022-12-01  发布在  其他
关注(0)|答案(3)|浏览(140)

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

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
bkhjykvo

bkhjykvo1#

“搜索到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中的fox。

备注

如果要匹配的文本也可以包含换行符,那么你需要设置正则表达式引擎的“dot matches all”选项。通常,你可以通过在正则表达式前面添加(?s)来实现这一点,但是这并不是在所有正则表达式引擎中都有效(特别是JavaScript)。

替代解决方案:

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

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

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

gojuced7

gojuced72#

lookahead正则表达式语法可以帮助您实现目标。

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

(?=z) lookahead之前注意到.*?延迟匹配是很重要的:表达式匹配子字符串,直到第一次出现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
f0brbegy

f0brbegy3#

试试这个

(.*?quick.*?)z

相关问题