在做一些小的正则表达式任务时,我遇到了这个问题。我有一个字符串,它是一个标签列表,看起来像这样:
foo,bar,qux,garp,wobble,thud
我需要做的是检查某个标签是否存在,例如“garp”就在这个列表中。 (最终匹配什么并不重要,重要的是匹配与否。)
我的第一次也是有点愚蠢的尝试是使用以下正则表达式:
[^,]garp[,$]
我的想法是,在“garp”之前应该有行/字符串的开头或逗号,在“garp”之后应该有逗号或行/字符串的结尾。
现在,很明显这个正则表达式是错误的:^ 和 $ 都改变了它们在字符类 [ ] 上下文中的行为。
我最终想出的是以下内容:
^garp$|^garp,|,garp,|,garp$
这个正则表达式只是一一处理这 4 种情况。 (标记在列表的开头、中间、末尾,或者作为列表的唯一元素。)最后一个正则表达式在我看来有点丑陋,只是为了好玩,我想让它变得有点丑陋更优雅。
有没有办法在字符类的上下文中使用行首/行尾字符(^ 和 $)?
编辑: 好的,希望有更多信息,所以这里是: 我在 Oracle SQL 语句中使用它。遗憾的是,这不允许任何环视断言,但因为我只感兴趣是否存在匹配(而不是匹配的内容),这并没有真正影响我。 标签可以包含非字母字符,例如 - 或 _,因此 garp 不起作用。另外,正如 SilentGhost 所说,一个标签可以包含另一个标签,因此 /garp/ 也不起作用。
您不能按照您希望的方式在字符类中使用
^
和 $
- 它们将按字面解释,但您可以使用交替来实现相同的效果:
(^|,)garp(,|$)
你只需要使用单词边界(
\b
)而不是^
和$
:
\bgarp\b
只需使用环视即可解决此问题:
(?<=^|,)garp(?=$|,)
环视组和常规组的区别在于,对于常规组,逗号将成为匹配的一部分,而对于环视组则不会。在这种情况下,但没有什么区别。
没有正则表达式:
myString.Split(',').Contains("garp")