在做一些小的正则表达式任务时,我遇到了这个问题。我有一个字符串,它是一个标签列表,看起来像这样:
foo,bar,qux,garp,wobble,thud
我需要做的是检查某个标签,例如'garp'在此列表中。 (最终匹配的内容并不重要,只要匹配与否。)
我的第一个也是有点愚蠢的尝试是使用以下正则表达式:
[^,]garp[,$]
我的想法是,在'garp'之前应该是行/字符串的开头或逗号,在'garp'之后应该有逗号或行/字符串的结尾。
现在,很明显这个正则表达式是错误的:^和$都会在字符类[]的上下文中改变它们的行为。
我最终想出的是以下内容:
^garp$|^garp,|,garp,|,garp$
这个正则表达式只是逐个处理4个案例。 (标记在列表的开头,中间,最后,或作为列表的唯一元素。)最后的正则表达式在某种程度上有点丑陋在我的眼中,只是为了乐趣的缘故,我想做一点更优雅。
有没有办法如何在字符类的上下文中使用行/行结束字符(^和$)的开头?
编辑: 好的,希望更多的信息,所以这里是: 我在Oracle SQL语句中使用它。遗憾的是,这不允许任何环顾四周的断言,但是因为我只对匹配与否(而不是匹配的东西)感兴趣,这对我来说并没有真正影响我。 标签可以包含非字母字符,如 - 或_ so \ bgarp \ b不起作用。另外一个标签可以包含另一个标签,如SilentGhost所说,所以/ garp / does也可以工作。
答案 0 :(得分:79)
您不能以您希望的方式在字符类中使用^
和$
- 它们将按字面解释,但您可以使用替换来实现相同的效果:
(^|,)garp(,|$)
答案 1 :(得分:22)
您只需要使用字边界(\b
)而不是^
和$
:
\bgarp\b
答案 2 :(得分:5)
只需使用环视来解决这个问题:
(?<=^|,)garp(?=$|,)
与环视和常规群组的不同之处在于,对于常规群组,逗号将成为匹配的一部分,并且通过环视不会。在这种情况下,它没有任何区别。
答案 3 :(得分:3)
我是一个很大的正则表达式粉丝,但在这种情况下(以逗号分隔的字符串),尽管Mark Byers,SilentGhost和reko_t的解决方案都能正常工作,我宁愿建议查看CSV解析器。
这项工作可能过度,但我们不知道真正的要求和需要处理的真实数据。
答案 4 :(得分:1)
这可以通过SQL INSTR
函数(字符串的位置)进行相当优化,它不需要Regex。
只需检查是否/或:
garp
(列表中唯一的项目)garp,
位于字符串的第1位(即0位)(列表中的第一项),garp
位于LENGTH(string)
- LENGTH(',garp')
[1]位置(列表中的最后一项),garp,
(在列表中间)[1]这可能是一个错误的错误