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

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

我需要做的是检查某个标签,例如“ garp”是否在这个列表中。(它最终匹配什么并不重要,重要的是有没有匹配。)

我的第一次尝试有点愚蠢,就是使用下面的 regex:
[^,]garp[,$]

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

现在,很明显这个 regex 是错误的: ^ 和 $都改变了它们在字符类[]上下文中的行为。

我最后想到的是:
^garp$|^garp,|,garp,|,garp$

这个正则表达式只是处理4个案件一个。(标记位于列表的开头、中间、末尾,或者作为列表的唯一元素。)最后一个 regex 在我看来有点丑,为了好玩,我想让它更优雅一些。

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

编辑: 好的,我们希望得到更多的信息,这里是: 我在 Oracle SQL 语句中使用它。遗憾的是,这不允许任何查看断言,但由于我只对是否有匹配(而不是匹配的内容)感兴趣,因此这并不真正影响我。 标记可以包含非字母字符,如-or _ so bgarp b 不起作用。另外,一个标记可以包含另一个标记,如 SilentGhost 所说,所以/garp/也不起作用。

290365 次浏览

你不能在字符类中按照你希望的方式使用 ^$——它们会被逐字解释,但是你可以使用一个替换来达到同样的效果:

(^|,)garp(,|$)

只要四处看看就能解决这个问题:

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

查看和普通组的区别在于,对于普通组,逗号是匹配的一部分,而对于查看则不是。在这种情况下,它没有什么不同。

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

\bgarp\b

没有正则表达式:

myString.Split(',').Contains("garp")