正则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。
只要检查/ /或:
- 如果string等于
garp
(列表中唯一的项目) - 如果
garp,
位于string的位置1(即0位置)(列表中的第一项) - 如果
,garp
在LENGTH(string)
–LENGTH(',garp')
[1]位置(列表中的最后一个项目) - 如果string中包含
,garp,
那么(在列表中间)
[1]这里可能是一个错误的错误