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)