以这个正则表达式为例:/^[^abc]/
。这将匹配一个字符串开头的任何单个字符,除了a、b或c。
如果你在它后面加上一个*
--/^[^abc]*/
--正则表达式将继续在结果中加入每个后续字符,直到它遇到a
,或b
,**或c
。
例如,对于源字符串""qwerty qwerty whatever abc hello"",该表达式将匹配到""qwerty qwerty wh""。
但是,如果我想让匹配的字符串是"qwerty qwerty whatever "
呢?
...换句话说,我怎样才能匹配到(但不包括)准确的序列 "abc"
的所有内容?
你没有说明你使用的是哪种类型的regex,但这将是 在任何一个最流行的可以被认为是"完整"的工作。
/.+?(?=abc)/
.+?
部分是.+
的非贪婪版本(其中的一个或多个
任何东西)。)
当我们使用.+
时,引擎基本上会匹配所有的东西。
然后,如果在regex中还有其他的东西,它就会分步返回到
试图匹配下面的部分。
这就是贪婪行为。
意思是尽可能多的满足。
当使用.+?
时,不需要一次全部匹配,而是回过头来寻找
其他条件(如果有的话),引擎将通过以下方式匹配下一个字符。
步骤,直到 regex 的后续部分被匹配(如果有的话)。
这就是un-greedy,意思是匹配尽可能少的部分到
满足。
<!--语言。 lang-none -->
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX"
^^^^^^^^^^^^ ^^^^^^^^^^^^
/.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX"
^^^^ ^
继而我们有(?=
{内容}
)
,一个宽度为零的人。
断言,一_围观。
这种分组结构与它的
内容,但不计入匹配的字符(零宽度)。
它
只返回是否匹配(assertion)。
因此,换句话说,regex /.+?(?=abc)/
的意思是。
尽可能少地匹配任何字符,直到找到一个"abc" 被找到。 不算"abc"。
如果你想捕捉一切,直到"abc"。
/^(.*?)abc/
解释一下。
()
捕获括号内的表达式,以便使用$1
、$2
等访问。
^
匹配行首
.*
匹配任何东西,?
非贪婪地(匹配所需的最小字符数)- [1]
[1] 需要这样做的原因是,否则,在以下字符串中。
whatever whatever something abc something abc
默认情况下,词组是贪婪的,这意味着它将尽可能多地匹配。因此`/^.abc/将匹配"无论什么东西abc什么东西"。添加非贪婪的量词
?`使得该词条只匹配"无论什么东西"。
正如 @Jared Ng 和 @Issun 所指出的,解决这类 RegEx 的关键在于,像 "匹配某个词或子串之前的所有内容"或 "匹配某个词或子串之后的所有内容"。 或"匹配某个词或子串之后的所有内容"。 被称为"lookaround"。 零长度断言。 在这里阅读更多关于它们的内容][1] 。
在你的特殊情况下,可以通过积极展望未来来解决。 一图胜千言。 请看截图中的详细解释。
[![Regex101截图][2]][2] 。
[1]: http://www.regular-expressions.info/lookaround.html [2]: https://i.stack.imgur.com/cxm8d.png
你需要的是寻找周围的断言,如.+? (?=abc)
。
参见 [Lookahead and Lookbehind Zero-Length Assertions][1] 。
要知道,[abc]
和abc
不一样。
在括号内它'不是一个字符串--每个字符只是可能性之一。
在括号外,它就成了字符串。
我在这个stackoverflow的问题中结束了寻找帮助解决我的问题,但没有找到解决方法 :(
所以我不得不即兴发挥...... 经过一段时间的努力,我终于找到了我需要的regex:
[![在此输入图片描述][1]][1]
如你所见,我需要在"grp-bps".文件夹前增加一个文件夹,但不包括最后一个破折号。 文件夹,不包括最后一个破折号。 而且需要在"grp-bsp"文件夹后面至少有一个文件夹。 文件夹。
编辑
复制粘贴的文本版本(将'grp-bsp' 为您的文本)。)
.*//grp-bsp//[^//]+。
我相信你需要子表达式。如果我没记错的话,你可以使用普通的()
括号来表达子表达式。
这部分内容来自grep手册。
Back References and Subexpressions
The back-reference \n, where n is a single digit, matches the substring
previously matched by the nth parenthesized subexpression of the
regular expression.
做一些类似于^[^(abc)]
的事情应该会有效果。
试试这个
.+?efg
查询:
select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;
产出 :
hijklmn