如何在不同的上下文中使用行首/行尾符号(^或$)?

问题描述 投票:0回答:4

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

foo,bar,qux,garp,wobble,thud

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

我的第一次也是有点愚蠢的尝试是使用以下正则表达式:

[^,]garp[,$]

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

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

我最终想出的是以下内容:

^garp$|^garp,|,garp,|,garp$

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

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

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

regex eol
4个回答
112
投票

您不能按照您希望的方式在字符类中使用

^
$
- 它们将按字面解释,但您可以使用交替来实现相同的效果:

(^|,)garp(,|$)

27
投票

你只需要使用单词边界(

\b
)而不是
^
$

\bgarp\b

7
投票

只需使用环视即可解决此问题:

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

环视组和常规组的区别在于,对于常规组,逗号将成为匹配的一部分,而对于环视组则不会。在这种情况下,但没有什么区别。


1
投票

没有正则表达式:

myString.Split(',').Contains("garp")
© www.soinside.com 2019 - 2024. All rights reserved.