直到但不包括正则expression式
对于正则expression式search的语法是什么,但不包括? 有点像:
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
search”的明确方式是:
(?:(?!X).)*
其中X
可以是任何正则expression式。
就你而言,这可能是矫枉过正的 – 这里最简单的方法是
[^z]*
这将匹配除z
以外的任何东西,因此在下一个z
之前停止。
所以.*?quick[^z]*
会匹配The quick fox jumps over the la
.*?quick[^z]*
。
但是,只要你有多个简单的信件要注意, (?:(?!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.
此外,在search关键字时,您可能希望用词边界锚将它们包围: \bfox\b
只会匹配完整的单词fox
而不是fox中的foxy
。
注意
如果要匹配的文本也可以包含换行符,则需要设置正则expression式引擎的“点匹配全部”选项。 通常,你可以通过预先考虑(?s)
到正则expression式来实现,但是这在所有正则expression式引擎(特别是JavaScript)中都不起作用。
替代scheme:
在许多情况下,你也可以使用一个更简单,更可读的解决scheme,使用一个懒惰的量词。 通过添加一个?
到*
量词,它会尝试从当前位置尽可能less地匹配字符:
.*?(?=(?:X)|$)
将匹配任意数量的字符,在X
(可以是任何正则expression式)或string的末尾(如果X
不匹配)之前停止。 您可能还需要设置“点全部匹配”选项才能使用。 (注意:我在X
周围添加了一个非捕获组,以便可靠地将其与交替隔离)
一个超前的正则expression式语法可以帮助你实现你的目标。 因此,你的例子是一个正则expression式
.*?quick.*?(?=z)
重要的是要注意到.*?
(?=z)
超前之前的延迟匹配:expression式匹配子string,直到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