正则表达式:在不同的上下文中使用行首/行尾符号(^或$)


69

在执行一些小的正则表达式任务时,我遇到了这个问题。我有一个字符串,它是一个标签列表,看起来像这样:
foo,bar,qux,garp,wobble,thud

我需要做的是检查此列表中是否有某个标签,例如“ garp”。(无论是否匹配,最终匹配的内容并不重要。)

我的第一个愚蠢尝试是使用以下正则表达式:
[^,]garp[,$]

我的想法是在'garp'之前应该是行/字符串的开头或逗号,在'garp'之后应该是逗号或行/字符串的结尾。

现在,很明显该正则表达式是错误的:^和$都在字符类[]的上下文中改变了它们的行为。

我最终想到的是以下内容:
^garp$|^garp,|,garp,|,garp$

这个正则表达式只一一处理4种情况。(标记在列表的开头,中间,结尾或作为列表的唯一元素。)最后一个正则表达式在我眼中有点难看,为了娱乐起见,我想稍微做一下更优雅。

有没有一种方法可以在字符类的上下文中使用行首/行尾(^和$)?

编辑:好的,希望有更多信息,所以在这里是:我在Oracle SQL语句中使用它。可悲的是,这不允许有任何环视断言,但由于我只对是否存在匹配项(而不是匹配项)感兴趣,因此这实际上并不会影响我。标签可以包含非字母字符,例如-或_,因此\ bgarp \ b将不起作用。正如SilentGhost所说,一个标签也可以包含另一个标签,因此/ garp /也不起作用。


也许我是个误会,但我认为您忽略了显而易见的事实。正则表达式/garp/本身应该没问题。它将告诉您字符串“ garp”是否与行中的任何位置匹配。几个问题:您使用哪种语言?您的更大目标是什么?(例如,您是否需要提取匹配项?)为什么您认为需要匹配每行可能出现“ garp”的特定方式?
Telemachus 2010年

@Telemachus:/garp/也可以找到agarpor例如。
SilentGhost 2010年

@SilentGhost:是的,这是真的(对我来说很愚蠢)。我误解了OP的“最终匹配的内容并不重要”。
Telemachus 2010年

Answers:


100

您不能使用^$以您希望的方式在字符类中-它们将按字面意义进行解释,但是您可以使用替换来达到相同的效果:

(^|,)garp(,|$)

很好,这就是我想要的。。。看起来比我的原始或链式的好很多……:) ty。
fgysin恢复莫妮卡

4
请记住,在大多数情况下^,要$匹配字符串的开头和结尾,要使其与行的开头匹配,请使用m标记,如下所示/^.*$/m
Timo Huovinen 2014年

23

您只需要使用单词边界(\b)代替^$

\bgarp\b

1
它被称为单词边界,虽然在这种情况下可以正常工作,但是如果该值中包含非单词字符(例如破折号foo,garp-er,bar:),则它将失败,即使没有逗号或末尾,也可以匹配garp它之后的字符串
reko_t 2010年

1
+1,击败我。尽管在他的示例中,他可以简单地使用garp它并且可以工作。不清楚他的真正要求是什么...
Tim Pietzcker 2010年

@reko_t:感谢您的纠正,但是它不会失败,因为您一直在寻找garp-er
SilentGhost 2010年

@reko:对。但是,如果它变得如此复杂,那么CSV解析器可能是更好的选择。谁知道我们是否可能在字符串中嵌入逗号?
蒂姆·皮茨克

@Tim:我想如果另一个标签没有'garper'字边界,它将找到两者
SilentGhost 2010年

5

只需使用环顾四周即可解决此问题:

(?<=^|,)garp(?=$|,)

与环视和常规组的区别在于,对于常规组,逗号将成为比赛的一部分,而环视则不是。在这种情况下,它没有任何区别。


1
另外,您也可以分组(garp)并获得该分组的结果
Stephan Bijzitter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.