采用以下正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a、b或c除外。
如果在其后面添加*–/^[^abc]*/–正则表达式将继续向结果中添加每个后续字符,直到它满足a、b或c。
例如,对于源字符串“qwerty qwerty whatever abc hello”,表达式将匹配到“qwerty-qwerty wh”。
但如果我希望匹配的字符串是“qwerty qwerty whatever”呢?
换句话说,我如何将所有内容都匹配到(但不包括)精确的序列“abc”?
采用以下正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a、b或c除外。
如果在其后面添加*–/^[^abc]*/–正则表达式将继续向结果中添加每个后续字符,直到它满足a、b或c。
例如,对于源字符串“qwerty qwerty whatever abc hello”,表达式将匹配到“qwerty-qwerty wh”。
但如果我希望匹配的字符串是“qwerty qwerty whatever”呢?
换句话说,我如何将所有内容都匹配到(但不包括)精确的序列“abc”?
当前回答
所以我不得不即兴发挥。。。过了一段时间,我终于找到了所需的正则表达式:
如您所见,我需要在“grp bps”文件夹之前最多一个文件夹,但不包括最后一个破折号。并且要求在“grp bps”文件夹之后至少有一个文件夹。
复制粘贴的文本版本(更改文本的“grp bps”):
.*\/grp-bps\/[^\/]+
在寻求帮助解决问题后,我以堆栈溢出问题结束,但我没有找到任何解决方法:(
其他回答
解决方案
/[\s\s]*?(?=abc)/
这将匹配
直到(但不包括)精确的序列“abc”
正如OP所问的,即使源字符串包含换行符,即使序列以abc开头。但是,如果源字符串可能包含换行符,请确保包含多行标志m。
它的工作原理
\s表示任何空白字符(例如空格、制表符、换行符)
\S表示任何非空白字符;即与%s相反
一起[\s\s]表示任何字符。这几乎与相同。除此之外。与换行符不匹配。
*表示前面的标记出现了0+次。在源字符串以abc开头的情况下,我使用了this而不是+。
(?=)被称为正向前瞻。它需要与括号中的字符串匹配,但恰好在它之前停止,因此(?=abc)表示“直到但不包括abc,但abc必须存在于源字符串中”。
? 介于[\s\s]*和(?=abc)之间表示懒惰(又称非贪婪)。即在第一abc处停止。如果abc出现不止一次,那么如果没有这一点,它将捕获直到abc最后出现的每个字符。
试试看:
.+?efg
查询:
select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;
输出:
hijklmn
这将对正则表达式有意义。
确切的单词可以从以下regex命令中获得:
("(.*?)")/g
在这里,我们可以得到属于双引号内的全局准确单词。
例如,如果我们的搜索文本是
这是“双引号”单词的示例
然后我们会从那句话中得到“双引号”。
我相信你需要子表达式。子表达式可以使用普通()括号。
本部分来自grep手册:
反向引用和子表达式后引用\n(其中n是一个数字)与子字符串匹配之前由正则表达式。
做类似于^[^(abc)]的事情应该会奏效。
您的问题没有指定后续的字符序列是否是可选的,但所有其他答案都假定序列总是给定的。所以这里有一个,如果序列是可选的。
例如,如果将代码匹配到像foo#这样的行注释。。。或foo//。。。,行注释本身可能是可选的,但可能仍然希望与前面的代码匹配。
在这种情况下,我会使用^(?:(?!abc)。)*(或行注释:^(?:(?!#)。)*或^(?:(?!\/\/).)*)。
说明:^标记行的开头。(?:)是一个非捕获组,因为常规组将额外捕获组中最后一个匹配的字母,这是我们不需要的。在组内,我们使用负前瞻(?!)和。,所以除了特定的序列之外,所有的东西都是匹配的。使用*重复0到无限次。如果只想匹配非空字符串,请改用+。