对于正则表达式,搜索的语法是什么,但不包括?有点像:
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
答案 0 :(得分:134)
明确表示“搜索到X
但不包括X
”的方式是:
(?:(?!X).)*
其中X
可以是任何正则表达式。
在你的情况下,这可能是过度的 - 这里最简单的方法是
[^z]*
这将匹配z
以外的任何内容,因此会在下一个z
之前停止。
因此.*?quick[^z]*
将匹配The quick fox jumps over the la
。
但是,只要您有多个简单的字母要注意,(?:(?!X).)*
就会发挥作用,例如
(?:(?!lazy).)*
- 在单词lazy
开头之前匹配任何内容。
这是使用 lookahead assertion ,更具体地说是否定前瞻。
.*?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
中的狐狸。
注意
如果要匹配的文本也可以包含换行符,则需要设置正则表达式引擎的“dot matches all”选项。通常,您可以通过将(?s)
添加到正则表达式来实现这一点,但这并不适用于所有正则表达式引擎(尤其是JavaScript)。
替代解决方案:
在许多情况下,您还可以使用更简单,更易读的解决方案,该解决方案使用延迟量词。通过向?
量词添加*
,它会尝试从当前位置匹配尽可能少的字符:
.*?(?=(?:X)|$)
将匹配任意数量的字符,在X
(可以是任何正则表达式)或字符串结尾(如果X
不匹配)之前停止。您可能还需要设置“点匹配所有”选项才能生效。 (注意:我在X
附近添加了一个非捕获组,以便可靠地将其与交替进行隔离)
答案 1 :(得分:9)
lookahead regex syntax可以帮助您实现目标。因此,你的例子的正则表达式是
.*?quick.*?(?=z)
在.*?
前瞻之前注意(?=z)
延迟匹配非常重要:表达式匹配子字符串,直到{{1>出现第一次信。
这是C#代码示例:
z
答案 2 :(得分:0)
试试这个
(.*?quick.*?)z