正则expression式:在不同的上下文中使用行开始/结束行符号(^或$)

在做一些小的正则expression式任务时,我遇到了这个问题。 我有一个string,看起来像这样的标签列表:
foo,bar,qux,garp,wobble,thud

我需要做的是检查某个标签,例如“garp”是否在这个列表中。 (它最终匹配的东西不是很重要,只是如果有匹配的话)。

我的第一个和有点愚蠢的尝试在这是使用以下正则expression式:
[^,]garp[,$]

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

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

我终于想出了以下几点:
^garp$|^garp,|,garp,|,garp$

这个正则expression式只是一个接一个地处理这4个例子。 (标签在列表的开头,在中间,在结尾,或作为列表的唯一元素。)最后一个正则expression式在某种程度上是丑陋在我眼里,只是为了母女的缘故,我想使它有点更优雅。

有没有办法如何在字符类的上下文中使用行/行尾字符(^和$)的开始?

编辑:好吧,希望更多的信息,所以这里是:我在一个Oracle SQL语句中使用这个。 这令人遗憾的是不允许任何环视声明,但是因为我只在有匹配或不匹配(而不是匹配)的情况下感兴趣,所以这并不影响我。 标签可以包含非字母字符,比如 – 或_ so \ bgarp \ b不起作用。 还有一个标签可以包含另一个标签,如SilentGhost所说的,所以/ garp / does not工作。

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

 (^|,)garp(,|$) 

你只需要使用字边界( \b )而不是^$

 \bgarp\b 

只要使用环视来解决这个问题:

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

与环视和常规组的区别在于,对于常规组,逗号将是比赛的一部分,并且环视则不会。 在这种情况下,它并没有改变。

我是一个很大的正则expression式,但是在这种情况下(以逗号分隔的string),尽pipeMark Byers,SilentGhost和reko_t的解决scheme都有效,但我宁愿build议查看CSVparsing器。

可能是工作过度,但是我们不知道真正的需求和需要处理的真实数据。

这可以用SQL INSTR函数(string的位置)进行优化,它不需要Regex。

只要检查/ /或:

  1. 如果string等于garp (列表中唯一的项目)
  2. 如果garp,位于string的位置1(即0位置)(列表中的第一项)
  3. 如果,garpLENGTH(string)LENGTH(',garp') [1]位置(列表中的最后一个项目)
  4. 如果string中包含,garp,那么(在列表中间)

[1]这里可能是一个错误的错误