采用以下正则表达式:/^[^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”?
当前回答
我想将sidyll的答案扩展到正则表达式的不区分大小写版本。
如果你想匹配abc/abc/abc。。。不区分大小写(我需要这样做),使用以下正则表达式。
.+?(?=(?i)abc)
说明:
(?i) - This will make the following abc match case insensitively.
正则表达式的另一种解释与sidyll指出的相同。
其他回答
匹配从开始到“在ABC之前”或“行结束”(如果没有ABC)
(1) 如果字符串在任何地方都不包含ABC,则匹配整个字符串
(2) 与空字符串不匹配
(不检查带换行符的字符串)
^.+?(?=ABC|$)
试试看:
.+?efg
查询:
select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;
输出:
hijklmn
这将对正则表达式有意义。
确切的单词可以从以下regex命令中获得:
("(.*?)")/g
在这里,我们可以得到属于双引号内的全局准确单词。
例如,如果我们的搜索文本是
这是“双引号”单词的示例
然后我们会从那句话中得到“双引号”。
所以我不得不即兴发挥。。。过了一段时间,我终于找到了所需的正则表达式:
如您所见,我需要在“grp bps”文件夹之前最多一个文件夹,但不包括最后一个破折号。并且要求在“grp bps”文件夹之后至少有一个文件夹。
复制粘贴的文本版本(更改文本的“grp bps”):
.*\/grp-bps\/[^\/]+
在寻求帮助解决问题后,我以堆栈溢出问题结束,但我没有找到任何解决方法:(
您没有指定使用的是哪种类型的正则表达式,但这将在任何一个最受欢迎的可以被认为是“完整”的工作。
/.+?(?=abc)/
它的工作原理
.+?部分是.+的非贪婪版本(一个或多个任何事情)。当我们使用.+,发动机基本上会匹配一切。然后,如果正则表达式中有其他内容,它将按步骤返回试图匹配以下部分。这是贪婪的行为,意味着尽可能满足。
使用.+?时?,而不是一次匹配,然后返回其他条件(如果有),引擎将通过以下方式匹配下一个字符步骤,直到匹配正则表达式的后续部分(如果有,则再次)。这是不贪婪的,意味着尽可能少地匹配满足
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX"
^^^^^^^^^^^^ ^^^^^^^^^^^^
/.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX"
^^^^ ^
接下来我们有(?={contents}),一个零宽度断言,环顾四周。此分组结构与其内容,但不算作匹配字符(零宽度)。它仅在是否匹配时返回(断言)。
因此,换句话说,正则表达式/.+?(?=abc)/表示:
尽可能少地匹配任何字符,直到找到“abc”,不计算“abc”。