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
这将匹配任何东西,除了 z 因此,在下一个 z . 所以 .*?quick[^z]* 将匹配 The quick fox jumps over the la . 然而,一旦你有不止一封简单的信要找, (?:(?!X).)* 例如,开始发挥作用 (?:(?!lazy).)* -匹配任何内容直到单词的开头 lazy . 这是使用一个前瞻Assert,更具体地说是一个消极的前瞻。 .*?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.
重要的是要注意 .*? 延迟匹配之前的 (?=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
3条答案
按热度按时间nafvub8i1#
表示“搜索到”的明确方式
X
但不包括X
“是:哪里
X
可以是任何正则表达式。然而,在你的情况下,这可能有点过头了——这里最简单的方法是
这将匹配任何东西,除了
z
因此,在下一个z
.所以
.*?quick[^z]*
将匹配The quick fox jumps over the la
.然而,一旦你有不止一封简单的信要找,
(?:(?!X).)*
例如,开始发挥作用(?:(?!lazy).)*
-匹配任何内容直到单词的开头lazy
.这是使用一个前瞻Assert,更具体地说是一个消极的前瞻。
.*?quick(?:(?!lazy).)*
将匹配The quick fox jumps over the
.说明:
此外,在搜索关键字时,您可能希望用单词边界锚将其包围:
\bfox\b
将只匹配完整的单词fox
但不是狐狸foxy
.笔记
如果要匹配的文本也可以包含换行符,则需要设置正则表达式引擎的“点匹配全部”选项。通常,您可以通过预先设置来实现这一点
(?s)
对于正则表达式,但这并不适用于所有正则表达式引擎(尤其是javascript)。替代解决方案:
在许多情况下,您还可以使用更简单、更可读的解决方案,该解决方案使用惰性量词。加入
?
到*
量词,它将尝试从当前位置匹配尽可能少的字符:将匹配任意数量的字符,在
X
(可以是任何正则表达式)或字符串的结尾(如果X
不匹配)。您可能还需要设置“点匹配所有”选项,以使其正常工作(注意:我在周围添加了一个非捕获组X
为了可靠地将其与交替隔离)w7t8yxp52#
前瞻正则表达式语法可以帮助您实现目标。因此,您的示例中的正则表达式是
重要的是要注意
.*?
延迟匹配之前的(?=z)
lookahead:表达式匹配子字符串,直到第一次出现z
信。以下是c#代码示例:
dxpyg8gm3#
试试这个