-4

2012ca-e001a083 のような文字列の場合、e001a083 のみを解析したいのですが、Java で次のような正規表現を使用してい(.*-)(.*)ます。この正規表現は正しいと思いますか?

4

3 に答える 3

1

エーテルを分割し-て最後の部分を取るか、次のように正規表現の 2 番目のグループを選択することができます

String data="2012ca-e001a083";
Pattern p=Pattern.compile("(.*-)(.*)");
Matcher m=p.matcher(data);
if (m.find()){
    System.out.println(m.group(2));
}

ただし、正規表現でのバックトラッキングはおそらくはるかに遅くなるため、分割メカニズムを使用することをお勧めします。


別のオプションもあります。ルックアラウンドメカニズムを使用できます。次に、必要なグループを指す必要はありません。

String data="2012ca-e001a083";
Pattern p=Pattern.compile("(?<=-).*");
Matcher m=p.matcher(data);
if (m.find()){
    System.out.println(m.group());
}
于 2013-03-14T21:26:01.937 に答える
1

一致するものの形式が非常に明確に定義されている場合は、形式をできるだけ厳密に一致させる方が安全です (そして多くの場合、より便利です)...

(\d{4}[a-z]{2})-(([a-z]\d{3}){2})

このように壊れるもの...

(        // start group 1
\d{4}    // four digits
[a-z]{2} // two letters (lowercase)
)        // close group 1
-        // hyphen
(        // start group 2
(        // start group 3 (repeats within group 2)
[a-z]    // letter
\d{3}    // three digits
){2}     // close group 3, matching when it repeats twice
)        // close group 2 (capturing the repeated group 3)

グループ 1 には の前のすべてが含まれ-、グループ 2 の後にはすべてが含まれます。

于 2013-03-14T21:29:04.943 に答える
0

そのREは機能し、2番目のグループとして必要なサブストリングを配信しますが、そこには貧弱なREがあります。特に、グループが必要ない場合は、グループをキャプチャしないようにする必要があります。また、バックトラックを試みるのではなく、最初の部分を1回だけスキャンできるようにする必要があります。REは、1回のスキャンで正しい文字列を解析できるため、[^-]*-([^-]*)より適しています(この場合、必要なのはREの最初のグループになります)。

于 2013-03-14T22:01:28.043 に答える