0

次のような文字列があります。

「これは@awesome @dudeです」

この文字列から、awesome と dude を抽出して文字列を作成したい

 output==> "awesome,dude"

だから私のコードは次のようなものです:

Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
while (matcher.find()){
    mergedStr += matcher.group() +",";
}

しかし、これは最終的にアーティファクトを作成します

output==> "awesome,dude,"  //<-- egghh comma.. in the end

これを解決するためのより良い方法は何ですか。

4

5 に答える 5

3

別のアプローチ:

boolean needComma = false;
while (blah, blah, blah) {
    if (needComma) {
        string += ",";
    }
    string += word;
    needComma = true;
}

しかし、十数の異なるアプローチがあります。

于 2013-06-04T21:08:53.560 に答える
1

別の一般的なアプローチを次に示します。

Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
StringBuilder sb = new StringBuilder();
while (matcher.find()){
    sb.append(matcher.group()).append(",");
}
return sb.toString().replaceAll(",$", "");

正規表現を使用したくない場合は、次のようにすることができます。

Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
StringBuilder sb = new StringBuilder();
while (matcher.find()){
    sb.append(matcher.group()).append(",");
}
if (sb.length() == 0) {
    return "";
}
else {
    return sb.toString().substring(0, sb.length() - 1);
} 
于 2013-06-04T21:07:19.227 に答える
1

このような場合に私がよく使用する便利なパターンは、最初の項目を追加してから、区切り記号の後に残りの項目を追加することです。これにより、ループまたは後処理で不要な条件を使用して末尾の区切り記号を削除することを回避できます。

私は知っています、マイクロ最適化は何とか、何とか、地獄の6番目の円、何とか、何とかですが、あなたの娯楽のためにここに含めるだけです:

    Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
    StringBuilder mergedStr = new StringBuilder();
    if (matcher.find()) {
      mergedStr.append(matcher.group());
      while (matcher.find()) {
        mergedStr.append(',').append(matcher.group());
      }
    }
    return mergedStr.toString();

StringBuilderまた、2 次アルゴリズム (文字列連結) を線形アルゴリズム ( ) に置き換えることが、悪い意味でのマイクロ最適化と見なされると100% 確信しているわけではありません。

于 2013-06-04T22:58:44.783 に答える