Java/Apexで一致する部分文字列の文字を取り除くために単一の正規表現を使用するにはどうすればよいですか?

私は文字列の状態略語を探しています。次に入力文字列の例を示します。

String inputStr = 'Albany, NY + Chicago, IL and IN, NY, OH and WI';

状態の略語に一致させるために使用しているパターンは次のとおりです。

String patternStr = '(^|\\W|\\G)[a-zA-Z]{2}($|\\W)';

私は試合をループしてループ中に非アルファベットを取り除いていますが、私はそれを1回のパスで行うことができるはずです。現在のアプローチは次のとおりです。

Pattern myPattern = Pattern.compile(patternStr);
Matcher myMatcher = myPattern.matcher(inputStr);
Pattern alphasOnly = Pattern.compile('[a-zA-Z]+');
String[] states = new String[]{};
while (myMatcher.find()) {
    String rawMatch = inputStr.substring(myMatcher.start(),myMatcher.end());
    Matcher alphaMatcher = alphasOnly.matcher(rawMatch);
    while (alphaMatcher.find()) {
        states.add(rawMatch.substring(alphaMatcher.start(),alphaMatcher.end()));
    }
}

System.debug(states);
|DEBUG|(NY, IL, IN, NY, OH, WI)

これはうまくいきますが、冗長でおそらく非効率です。これをJava/Apexで行うには、ワンパスの方法は何ですか?

2
上記の例は、Salesforce Apex(Javaと同様のプログラミング言語)にあります。
追加された 著者 Matt K,
JavaソリューションはApexに簡単に移植できるので、私はJavaとして投稿しましたが、あなたはあなたが直接コンパイルできないことは間違いありません。とにかくお返事いただきありがとうございます。
追加された 著者 barelyknown,
あなたの例はコンパイルされません - 二重引用符が必要で、そのような配列に文字列を追加することはできません。
追加された 著者 DNA,

1 答え

Matcher.group()を使う必要があります。これを試して:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Escaping
{
    public static void main(String[] args)
    {
        String inputStr = "Albany, NY + Chicago, IL and IN, NY, OH and WI";
        String patternStr = "(^|\\W|\\G)([a-zA-Z]{2})($|\\W)";

        Pattern myPattern = Pattern.compile(patternStr);
        Matcher myMatcher = myPattern.matcher(inputStr);
        StringBuilder states = new StringBuilder();
        while (myMatcher.find())
        {
            states.append(myMatcher.group(2));
            states.append(" ");
        }

        System.out.println(states);
    }
}

Output: NY IL IN NY OH WI

実際のシステムでは、すべての有効な州の略語のリストに対して検証したいと思うでしょう。さもなければ、あらゆる種類の迷惑メールを拾うことができます。

1
追加された
すばらしいです。ありがとう。私が気づいていなかったのは、それぞれのfind()をループして、myMatcher.group(2)を参照して部分文字列を取得できるということです。はるかに効率的です。
追加された 著者 barelyknown,