正则表达式直到但不包括

Noo*_*ath 65 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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 146

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

(?:(?!X).)*
Run Code Online (Sandbox Code Playgroud)

哪里X可以是任何正则表达式.

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

[^z]*
Run Code Online (Sandbox Code Playgroud)

这将匹配除了之外的所有内容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.
Run Code Online (Sandbox Code Playgroud)

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

注意

如果要匹配的文本也可以包括换行符,你将需要设置"点匹配所有"的正则表达式引擎的选项.通常情况下,你可以通过预先实现这一目标(?s)的正则表达式,但这并不适用于所有正则表达式引擎(特别是JavaScript的).

替代方案:

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

.*?(?=(?:X)|$)
Run Code Online (Sandbox Code Playgroud)

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


Igo*_*tov 10

一个前瞻的正则表达式语法,可以帮助你实现你的目标.因此,你的例子的正则表达式是

.*?quick.*?(?=z)
Run Code Online (Sandbox Code Playgroud)

.*?(?=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
Run Code Online (Sandbox Code Playgroud)