JIRA 标识符的正则表达式

问题描述 投票:0回答:5

我正在尝试从一行文本中提取 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。我不想强制要求匹配项前面必须有空格或其他分隔符,因为如果标识符位于行的开头,则会失败。

有人可以建议必要的符文吗?

谢谢。

python regex perl jira
5个回答
32
投票

官方 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 正则表达式(Java):

但是,我不太喜欢它,因为它会匹配“abcDEF-33”中的“DEF-33”,而我更喜欢完全忽略“abcDEF-33”。所以在我自己的代码中我使用:

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

注意“DEF-33”不再匹配:

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' ]

6
投票

您可以确保模式之前的字符要么是空格,要么是使用交替的字符串的开头。同样,请确保其后跟有空格或字符串结尾。

您可以使用这个正则表达式:

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

5
投票

2015 年左右,JIRA 开始允许在 JIRA 项目键中使用数字和下划线,因此 JIRA 票证的更新正则表达式为:

\b[A-Z][A-Z0-9_]+-[1-9][0-9]*

正则表达式详细信息:https://regex101.com/r/ZEzo2R/1

来源:

确保您选择受支持的项目密钥格式。仅支持满足以下所有规则的格式:

  • 第一个字符必须是字母,
  • 项目密钥中使用的所有字母必须来自现代罗马字母且大写,并且
  • 只能使用字母、数字或下划线字符。

Jira 问题密钥(或问题 ID)的格式为 -


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

0
投票

到目前为止,没有提到任何对我来说效果很好的事情,所以我提出了这个:

\b[A-Za-z][A-z\d_]{2,10}-\d{1,10}\b

效果很好(请参阅添加的屏幕截图),只有一个小问题(无法正确消除带有双“-”的代码)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.