【问题标题】:Regular expression for a JIRA identifierJIRA 标识符的正则表达式
【发布时间】:2013-10-19 19:13:40
【问题描述】:

我正在尝试从一行文本中提取 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


    【解决方案1】:

    官方 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 (?&lt;!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' ]
    

    【讨论】:

    • 知道如何在 python 中做到这一点吗? “Official JIRA ID Regex”和“Improved JIRA ID Regex”会导致 python 错误,“look-behind requires fixed-width pattern”。 python 中的“改进的 JIRA ID 正则表达式”似乎是最好的选择,但它与“INXX-2222s”[::-1] 之类的东西相匹配。马贝这值得一个独立的问题,而不是评论?
    • @grayaii Ruby 也有同样的问题,我用 JavaScript 方法解决了(reverse、match、reverse back)。但是,我更喜欢官方版本(只需删除小写 a-z),因为它增加了对格式错误的一些容忍度(假设提交消息应该是“已修复此\nABC-123”,但是,由于某种原因,你得到了“修复了这个ABC-123”)。我敢打赌,这就是官方正则表达式背后的原因。
    • 我遇到了这个问题,因为我的 JIRA 问题 ID 密钥是这样的:ABC1-123,其中短划线左侧的字母后面有一个数字。我最终得到了这个有效的正则表达式:((?&lt;!([A-Z])-?)[A-Za-z0-9_]+-\d+)
    • Jira 本身中的正则表达式 changed,因此 Jira 问题的“正确”正则表达式显然是 [A-Z][A-Z0-9]+-[0-9]+(产品代码必须至少有两个字符长,必须以字母开头并且必须全部为大写或数字)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这不太行……因为后视是可变长度(一个字符 [\s] 或无 [^]),这会导致 Variable length lookbehind not implemented in regex 错误。
    • @DaveG 已修复。谢谢:)
    • 也可以在 Python 中使用!谢谢!
    • 匹配项目密钥使用:my ( $id ) = ( $line =~ /(?:\s|^)([A-Z0-9_]+)(?=\s|$)/ );
    【解决方案3】:

    如果您在问题中包含示例数据,您可以从可能没有 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-9] 匹配 0001 的好点。我将重用正则表达式的 [1-9][0-9] 方面。你使用[:punct:] 不是意味着你会匹配“ABZ-123-foo”吗?仅供参考:JIRA 不会截断前缀 - 例如,我们有一个带有 INCIDENT 键的项目。
    猜你喜欢
    • 2011-12-19
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多