RegEx:如何匹配\ 1中的“除了”之外的任何值

时间:2012-05-24 04:42:11

标签: regex

我正在寻找名称 - 值对列表中的“额外”名称。 只有名字"ACTIVITY_nnnnn"才有意义。 每个名称后缀"_nnnnn"应该相同,如果不是, 这是应该检测到的错误情况。

给定:

OneTwo=ThreeFour
ACTIVITY_11111=56676566
ACTIVITY_11111=ASDFASDF
ACTIVITY_22222=ASDFwSDF
ABC-123=1121
ACTIVITY_33333=ASDFASsF
ACTIVITY_11111=ASFAFA
DEF-XXY=22222

在这种情况下,第一个不匹配位于ACTIVITY_11111ACTIVITY_22222之间。

当找到另一个“匹配”条目时,此表达式找到匹配项:

ACTIVITY_(\d*=)(.|\r|\n)*ACTIVITY_\1

这与我需要的完全相反......如果“Not \1”是可能的, 如果另一个条目具有不同的后缀,则表达式将匹配。

有没有办法指定^\1[^\1]之类的内容? \1处的单词可以是捕获组中的值。

1 个答案:

答案 0 :(得分:0)

我认为你要求的是:

ACTIVITY_(\d*=)(.|\r|\n)*ACTIVITY_(?!\1)

但是(1)我不确定群组是否被允许进行前瞻和(2)它不能完全符合您的要求 - 它会将每个 ACTIVITY_11111与ACTIVITY_22222匹配(所以你会获得多个匹配,或者只是从第一个11111而不是最后一个匹配。

我认为你需要的是:

ACTIVITY_(\d*=).*[\r\n]((?!ACTIVITY).*[\r\n])*ACTIVITY_(?!\1)

中间的额外内容会跳过无法匹配的ACTIVITY(当然,如果上面的(1)是一个问题,这可能会有效,这可能取决于你的正则表达式库。)