在做一些小的正则表达式任务时,我遇到了这个问题.我有一个字符串,它是一个标签列表,看起来像这样:
foo,bar,qux,garp,wobble,thud
我需要做的是检查某个标签,例如'garp'是否在此列表中.(最终匹配的内容并不重要,只要匹配与否.)
我的第一个和有点愚蠢的尝试是使用以下正则表达式:
[^,]garp[,$]
我的想法是,在'garp'之前应该是行/字符串的开头或逗号,在'garp'之后应该有逗号或行/字符串的结尾.
现在,很明显这个正则表达式是错误的:^和$都会在字符类[]的上下文中改变它们的行为.
我最终想出的是以下内容:
^garp$|^garp,|,garp,|,garp$
这个正则表达式只是逐个处理4个案例.(标记在列表的开头,中间,最后,或作为列表的唯一元素.)最后的正则表达式在某种程度上有点丑陋在我的眼中,只是为了乐趣的缘故,我想做一点更优雅.
有没有办法如何在字符类的上下文中使用行/行结束字符(^和$)的开头?
编辑:好的,希望更多的信息,所以这里是:我在Oracle SQL语句中使用它.遗憾的是,这不允许任何环顾四周的断言,但是因为我只对匹配与否(而不是匹配的东西)感兴趣,这对我来说并没有真正影响我.标签可以包含非字母字符,如 - 或_ so\bgarp\b不起作用.另外一个标签可以包含另一个标签,如SilentGhost所说,所以/ garp/doesnt也可以工作.
Mar*_*ers 88
您不能以您希望的方式使用^
和$
在字符类中 - 它们将按字面解释,但您可以使用替换来实现相同的效果:
(^|,)garp(,|$)
Run Code Online (Sandbox Code Playgroud)
只需使用环顾四周即可解决此问题:
(?<=^|,)garp(?=$|,)
Run Code Online (Sandbox Code Playgroud)
与环视和常规组的区别在于,对于常规组,逗号将成为比赛的一部分,而环视则不是。在这种情况下,它没有任何区别。