1

私はJava7を使用しています。

バンドルファイル名またはプロパティファイル名を表す文字列から言語と国を抽出したいと思います。ファイル名に拡張子が含まれていません。

例えば

  • バンドル->空の文字列またはnull
  • bundle_en-> en
  • bundle_en_US-> en_US
  • Complex_bundle_name_en_US-> en_US

これを試しましたが、期待した結果が得られません。

private static void testPattern(String bundleName) {
        final Pattern pattern = Pattern.compile(".+(_[a-z]{2,3}(_[A-Z]{2,3}){0,1}){0,1}");
        final Matcher matcher = pattern.matcher(bundleName);
        if (matcher.matches()) {
            for (int i = 0; i < matcher.groupCount(); ++i) {
                System.out.println("Group " + i  + " = " + matcher.group(i));
            }
        } else {
            System.out.println("Nothing");
        }
    }

「bundle_en_US」の場合、そのショー:

グループ0=bundle_fr_USグループ1=null

正規表現を修正するのを手伝ってもらえますか、それともこの正規表現がJavaコアにすでに存在している可能性がありますか?

ありがとう。

4

2 に答える 2

2

問題は.+、最初はすでにシーケンス全体と一致しているimoです。代わりに、気が進まない数量詞を使用してください。

.+?(_[a-z]{2,3}(_[A-Z]{2,3}){0,1}){0,1}

編集:私がこれを検討する最高の解決策:

.+?(?:_([a-z]{2,3})(?:_([A-Z]{2,3}))?)?

非キャプチャグループを使用すると、これは言語と国コードのみをキャプチャし、「_」を破棄します。さらに、for条件を変更する必要がありますi <= matcher.groupCount()。そうしないと、最後のグループを見逃します。最後のバージョンと変更された条件を使用すると、次のようになります。

入力:bundle
出力:

Group 0 = bundle
Group 1 = null
Group 2 = null

入力:bundle_en
出力:

Group 0 = bundle_en
Group 1 = en
Group 2 = null

入力:bundle_en_US
出力:

Group 0 = bundle_en_US
Group 1 = en
Group 2 = US
于 2012-08-21T10:04:11.963 に答える
0

これはうまくいきますか?

     final Pattern pattern = Pattern.compile(".+_([a-z]{2,3}(_[A-Z]{2,3})?)?");
于 2012-08-21T09:45:46.150 に答える