对于正则表达式,搜索直到但不包括的语法是什么?有点像:
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
对于正则表达式,搜索直到但不包括的语法是什么?有点像:
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
说“搜索直到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
,以便可靠地将其与交替隔离)
前瞻正则表达式语法可以帮助您实现目标。因此,您的示例的正则表达式是
.*?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
试试这个
(.*?quick.*?)z