如何在正则表达式中匹配“直到这个字符序列为止的任何内容”?

851

拿这个正则表达式举例:/^[^abc]/。它将匹配字符串开头的任何单个字符,但不包括abc

如果你在它后面加上一个*/^[^abc]*/ – 正则表达式将继续将每个随后的字符添加到结果中,直到遇到a, 或者b, 或者c为止。

例如,在源字符串"qwerty qwerty whatever abc hello"的情况下,该表达式将匹配到"qwerty qwerty wh"

但如果我想要匹配字符串为"qwerty qwerty whatever "呢?

换句话说,如何匹配到(但不包括)精确序列"abc"


“match but not including” 是什么意思? - Toto
9
我的意思是我想匹配 "qwerty qwerty whatever " - 不包括 "abc"。换句话说,我不想匹配结果为 "qwerty qwerty whatever abc" - callum
4
在JavaScript中,你可以使用string.split('abc')[0]来解决这个问题。虽然这不是官方解答,但我认为这种方法比正则表达式更为简单明了。 - Wylliam Judd
15个回答

2

这将解释正则表达式的含义。

可以通过以下正则表达式命令获取确切的单词:

("(.*?)")/g

在这里,我们可以全球范围内获得双引号内的确切单词。

例如,如果我们的搜索文本是

这是“双引号”单词的例子

那么我们将从该句子中获得“双引号”。


1
欢迎来到StackOverflow,并感谢您的尝试帮助。然而,我发现这对于问题中所述的目标有何帮助并不明显。您能否详细说明一下?您能将其应用于给定的示例吗?您似乎专注于处理",但对我来说,这似乎与问题无关。 - Yunnosch
1
嗨,我已经解释了如何获取特殊字符之间的单词或句子。在这里,我们的问题也是“任何东西直到特殊字符序列”。所以我尝试了双引号并在这里解释了它。谢谢。 - Ponmurugan Mohanraj

2

您的问题没有指定后续字符序列是可选的还是必须的,但其他答案都假设序列总是给出的。因此,如果序列是可选的,这里有一个解决方案。

例如,如果匹配代码直到行注释,如foo # ...foo // ...,则行注释本身可能是可选的,但仍然希望匹配前面的代码。

在这种情况下,我会使用^(?:(?!abc).)*(或对于行注释:^(?:(?!#).)*^(?:(?!\/\/).)*)。

解释:
^标记行的开头。(?:)是一个非捕获组,因为正则表达式组会额外捕获组中最后一个匹配的字母,而我们不需要。
在组内,我们使用负向先行断言(?!).,因此匹配所有内容,除了特定的序列。这使用*重复0到无限次。如果您只想匹配非空字符串,请改用+


-1

我认为你需要子表达式。你可以使用普通的()括号来表示子表达式。

这部分内容来自于grep手册:

反向引用和子表达式

反向引用 \n,其中 n 是一个数字,匹配正则表达式中第 n 个带括号的子表达式之前匹配的子字符串。

^[^(abc)]这样做应该就可以了。


1
抱歉,那行不通。在括号中放置abc似乎没有任何区别。它们仍然被视为“a或b或c”。 - callum
[^...] 表示“方括号内的任何字符都不是匹配项”,而不是“不匹配方括号后面的内容”,因此这并不能解决问题。 - Paul Masri-Stone

-2

$符号标志着字符串的结尾,所以像这样的表达式应该可以工作:[[^abc]*]$,其中你正在寻找任何不以abc的任何迭代结尾的内容,但它必须在末尾。

此外,如果您使用带有正则表达式的脚本语言(如PHP或JavaScript),它们具有搜索函数,当它第一次遇到模式时就会停止搜索(您可以指定从左侧开始还是从右侧开始,或者使用php,您可以执行implode来镜像字符串)。


-7

试试这个:

.+?efg

查询:

select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;

输出:

hijklmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接