如何将分支与负向和正向前瞻性正则表达式进行匹配?

时间:2017-02-16 09:01:25

标签: regex pcre regex-lookarounds

我正在使用一些版本,必须编写一个正则表达式来包含一些分支,但排除其他分支(为了创建构建版本)。

我能想出的最好的是这个正则表达式使用正面和负面的前瞻来匹配分支名称:

(?=.*12\.3)^((?!(version-12\.3)).)*$

以下是分支机构名称和应如何匹配

bugfix-ISSUE-123-some-details-version-12.3
ISSUE-1234-some-other-details-version-12.3
bugfix-12.3
bugfix2-12.3
12.3stuff
stu12.3ff

// match everything above, but don't match anything from below

master
version-12.3
version-3.21
some-other-branch
bugfix-3.21
test

请使用this online tool(这是我发现的唯一一个支持消极和积极的前瞻性正则表达式)。

现在我提出的正则表达式工作正常,除了以下两个分支

bugfix-ISSUE-123-some-details-version-12.3
ISSUE-1234-some-other-details-version-12.3

不包含它们的原因是因为我使用了这个负面的前瞻性正则表达式,它排除了version-12.3(我想要的),但也排除了包含此字符串的任何其他内容(如ISSUE-123-version-12.3,我想要的包括,但它不是):

((?!(version-12\.3)).)*$

请帮帮忙吗?

1 个答案:

答案 0 :(得分:1)

如果您需要使所有匹配失败,其中包含12.3的字符串以version- +某些数字/点开头,您可以使用

^(?!version-\d+\.\d).*12\.3.*$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?!version-\d+\.\d) - 如果在字符串开头有version-,1位数字,一个点和一位数字,则会导致匹配失败的否定前瞻
  • .* - 任何0 +字符(换行符除外)
  • 12\.3 - 12.3子字符串
  • .* - 任何0 +字符(换行符除外)
  • $ - 字符串结束。

如果不允许将version- +位数/点作为整个字符串,请使用

^(?!version-[\d.]+$).*12\.3.*$

请参阅another regex demo

在这里,^将匹配字符串的开头,然后(?!version-[\d.]+$)将触发检查:如果version-后跟1+位/点到字符串结尾( $)比赛将失败。