JIRA标识符的正则表达式

时间:2013-10-11 16:12:32

标签: python regex perl jira

我正在尝试从一行文本中提取JIRA标识符。

JIRA标识符的格式为[A-Z] + - [0-9] - 我有以下模式:

foreach my $line ( @textBlock ) {
    my ( $id ) = ( $line =~ /[\s|]?([A-Z]+-[0-9]+)[\s:|]?/ );
    push @jiraIDs, $id if ( defined $id && $id !~ /^$/ );
}

如果有人指定一些包含另一个字符串中的模式的文本,则无法应对 - 例如blah_blah_ABC-123将与ABC-123匹配。我不想要求在比赛前面必须有空格或其他分隔符,因为如果标识符位于该行的开头,则会失败。

有人可以提出必要的符文吗?

感谢。

3 个答案:

答案 0 :(得分:11)

官方JIRA ID正则表达式(Java):

Atlassian本身有几个网页浮动,表明一个好的(java)正则表达式是这样的:

((?<!([A-Z]{1,10})-?)[A-Z]+-\d+)

(资料来源:https://confluence.atlassian.com/display/STASHKB/Integrating+with+custom+JIRA+issue+key

Test String:
"BF-18 abc-123 X-88 ABCDEFGHIJKL-999 abc XY-Z-333 abcDEF-33 ABC-1"

Matches:
BF-18, X-88, ABCDEFGHIJKL-999, DEF-33, ABC-1

改进的JIRA ID Regex(Java):

但是,我并不喜欢它,因为它会匹配&#34; DEF-33&#34;来自&#34; abcDEF-33&#34;,而我宁愿忽略&#34; abcDEF-33&#34;共。所以在我自己的代码中我使用:

((?<!([A-Za-z]{1,10})-?)[A-Z]+-\d+)

注意&#34; DEF-33&#34;不再匹配:

Test String:
"BF-18 abc-123 X-88 ABCDEFGHIJKL-999 abc XY-Z-333 abcDEF-33 ABC-1"

Matches:
BF-18, X-88, ABCDEFGHIJKL-999, ABC-1

改进的JIRA ID正则表达式(JavaScript):

我还需要JavaScript中的这个正则表达式。遗憾的是,JavaScript不支持LookBehind (?<!a)b,因此我不得不将其移植到LookAhead a(?!b)并反转所有内容:

var jira_matcher = /\d+-[A-Z]+(?!-?[a-zA-Z]{1,10})/g

这意味着要匹配的字符串也需要提前反转:

var s = "BF-18 abc-123 X-88 ABCDEFGHIJKL-999 abc XY-Z-333 abcDEF-33 ABC-1"
s = reverse(s)
var m = s.match(jira_matcher);

// Also need to reverse all the results!
for (var i = 0; i < m.length; i++) {
    m[i] = reverse(m[i])
}
m.reverse()
console.log(m)

// Output:
[ 'BF-18', 'X-88', 'ABCDEFGHIJKL-999', 'ABC-1' ]

答案 1 :(得分:6)

您可以确保模式前面的字符是空格,或使用替换字符串的开头。同样要确保它后面跟着空格或字符串的结尾。

您可以使用此正则表达式:

my ( $id ) = ( $line =~ /(?:\s|^)([A-Z]+-[0-9]+)(?=\s|$)/ );

答案 2 :(得分:1)

如果您在问题中包含样本数据,那么您可以从那些可能没有Jira等的人那里获得最佳答案。

这是另一种看法 -

my $matcher = qr/ (?: (?<=\A) | (?<=\s) )
                  ([A-Z]{1,4}-[1-9][0-9]{0,6})
                  (?=\z|\s|[[:punct:]]) /x;

while ( <DATA> )
{
    chomp;
    my @matches = /$matcher/g;
    printf "line: %s\n\tmatches: %s\n",
        $_,
        @matches ? join(", ", @matches) : "none";
}

__DATA__
JIRA-001 is not valid but JIRA-1 is and so is BIN-10000,
A-1, and TACO-7133 but why look for BIN-10000000 or BINGO-1?

请记住,[0-9]将匹配0001和您可能不想要的朋友。我认为,但无法验证,Jira将问题前缀截断为最多4个字符。所以我所做的正则表达式只允许1-4个大写字母;如果错误容易改变。对于发行数字而言,1000万张门票似乎是一个相当高的高端。我也允许尾随标点符号。你可能不得不尝试那种味道,狂野的数据。如果您匹配的字符串可能包含多个问题ID,则需要g并捕获到数组而不是标量。

line: JIRA-001 is not valid but JIRA-1 is and so is BIN-10000,
        matches: JIRA-1, BIN-10000
line: A-1, and TACO-7133 but why look for BIN-10000000 or BINGO-1?
        matches: A-1, TACO-7133