22

テキスト行から JIRA 識別子を抽出しようとしています。

JIRA 識別子は [AZ]+-[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 に一致します。識別子が行の先頭にあると失敗するため、一致の前にスペースまたはその他の区切り文字が必要であることを強制したくありません。

誰でも必要なルーン文字を提案できますか?

ありがとう。

4

3 に答える 3

22

公式 JIRA ID 正規表現 (Java):

Atlassian 自体には、適切な (Java) 正規表現がこれであることを示唆するいくつかの Web ページが浮かんでいます。

((?<!([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' ]
于 2015-05-28T23:56:18.197 に答える
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 文字しか使用できません。間違っていても簡単に変更できます。1,000 万件のチケットは、発行数のかなり高い上限のようです。末尾の句読点も許可しました。そういうものを味付けする必要があるかもしれません、野生のデータ。g複数の問題 ID を持つ可能性のある文字列を照合する場合は、スカラーの代わりに配列にキャプチャする必要があります。

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
于 2013-10-11T21:13:09.357 に答える