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

时间:2010-03-31 11:25:40

标签: regex

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

我需要做的是检查某个标签,例如'garp'在此列表中。 (最终匹配的内容并不重要,只要匹配与否。)

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

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

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

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

这个正则表达式只是逐个处理4个案例。 (标记在列表的开头,中间,最后,或作为列表的唯一元素。)最后的正则表达式在某种程度上有点丑陋在我的眼中,只是为了乐趣的缘故,我想做一点更优雅。

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

编辑: 好的,希望更多的信息,所以这里是: 我在Oracle SQL语句中使用它。遗憾的是,这不允许任何环顾四周的断言,但是因为我只对匹配与否(而不是匹配的东西)感兴趣,这对我来说并没有真正影响我。 标签可以包含非字母字符,如 - 或_ so \ bgarp \ b不起作用。另外一个标签可以包含另一个标签,如SilentGhost所说,所以/ garp / does也可以工作。

5 个答案:

答案 0 :(得分:79)

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

(^|,)garp(,|$)

答案 1 :(得分:22)

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

\bgarp\b

答案 2 :(得分:5)

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

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

与环视和常规群组的不同之处在于,对于常规群组,逗号将成为匹配的一部分,并且通过环视不会。在这种情况下,它没有任何区别。

答案 3 :(得分:3)

我是一个很大的正则表达式粉丝,但在这种情况下(以逗号分隔的字符串),尽管Mark Byers,SilentGhost和reko_t的解决方案都能正常工作,我宁愿建议查看CSV解析器。

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

答案 4 :(得分:1)

这可以通过SQL INSTR函数(字符串的位置)进行相当优化,它不需要Regex。

只需检查是否/或:

  1. 如果字符串等于garp(列表中唯一的项目)
  2. 如果garp,位于字符串的第1位(即0位)(列表中的第一项)
  3. 如果,garp位于LENGTH(string) - LENGTH(',garp') [1]位置(列表中的最后一项)
  4. 如果字符串包含,garp,(在列表中间)
  5. [1]这可能是一个错误的错误