正则表达式,直到但不包括

tcbh2hod  于 2021-09-08  发布在  Java
关注(0)|答案(3)|浏览(370)

对于正则表达式,搜索到但不包括的语法是什么?有点像:

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
nafvub8i

nafvub8i1#

表示“搜索到”的明确方式 X 但不包括 X “是:

(?:(?!X).)*

哪里 X 可以是任何正则表达式。
然而,在你的情况下,这可能有点过头了——这里最简单的方法是

[^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.

此外,在搜索关键字时,您可能希望用单词边界锚将其包围: \bfox\b 将只匹配完整的单词 fox 但不是狐狸 foxy .
笔记
如果要匹配的文本也可以包含换行符,则需要设置正则表达式引擎的“点匹配全部”选项。通常,您可以通过预先设置来实现这一点 (?s) 对于正则表达式,但这并不适用于所有正则表达式引擎(尤其是javascript)。
替代解决方案:
在许多情况下,您还可以使用更简单、更可读的解决方案,该解决方案使用惰性量词。加入 ?* 量词,它将尝试从当前位置匹配尽可能少的字符:

.*?(?=(?:X)|$)

将匹配任意数量的字符,在 X (可以是任何正则表达式)或字符串的结尾(如果 X 不匹配)。您可能还需要设置“点匹配所有”选项,以使其正常工作(注意:我在周围添加了一个非捕获组 X 为了可靠地将其与交替隔离)

w7t8yxp5

w7t8yxp52#

前瞻正则表达式语法可以帮助您实现目标。因此,您的示例中的正则表达式是

.*?quick.*?(?=z)

重要的是要注意 .*? 延迟匹配之前的 (?=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
dxpyg8gm

dxpyg8gm3#

试试这个

(.*?quick.*?)z

相关问题