1

入力文字列は次"outer string "inside a quote" "
のとおりです。出力は次のようになります。"outer string inside a quote "

正規表現を提案して、内側の二重引用符を見つけ、Javaを使用してスペースに置き換えてください。

4

3 に答える 3

2

この方法で、正規表現を使用せずに1 回の反復で試すことができます。

/*
 * I assume that if after quote ther is character like "a then it is
 * beggining of cite. Rest quotes are closing ones.
 */
public static String removeInnerQuotes(String data) {

    StringBuilder sb = new StringBuilder();
    int quoteCounter = 0;
    char[] array = data.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (array[i] == '"') {
            if (i + 1 < array.length
                    && (
                            (array[i + 1] >= 'a' && array[i + 1] <= 'z') 
                        || 
                            (array[i + 1] >= 'A' && array[i + 1] <= 'Z')
                        )
                ){
                quoteCounter++;
                if (quoteCounter == 1)
                    sb.append('"');
            }
            else{
                quoteCounter--;
                if (quoteCounter == 0)
                    sb.append('"');
            }

        } else
            sb.append(array[i]);
    }
    return sb.toString();
}

public static void main(String[] args) {
    String data = "\"outer string \"inside a quote\" abc\" something outside quote, and again \"outer string \"inside a quote\" def \"";
    System.out.println(removeInnerQuotes(data));
}

出力:

"outer string inside a quote abc" something outside quote, and again "outer string inside a quote def "

于 2012-07-25T12:38:23.920 に答える
1

ネストのレベルが 1 つだけで、外側の引用符の内側に内側の引用符が 1 つだけあると仮定すると、次のように動作するはずです。

str.replaceAll("\"(\\b[^\"]+)?\"\\b([^\"]+)\\b\"([^\"]+\\b)?\"","\"$1$2$3\"");

単語の境界によって開始引用符と終了引用符を検出しようとします。外側と内側の引用符の間に (単語の代わりに) 空白を許可し、内側の引用符には空白を入れないようにするには、次のようにします。

str.replaceAll("\"(\\b[^\"]+|\\s+)?\"(\\b[^\"]+\\b)?\"([^\"]+\\b|\\s+)?\"","\"$1$2$3\"");
于 2012-07-25T13:09:34.550 に答える
0

この場合、正規表現ソリューションが利用可能であれば、保守可能になるように少し複雑になる可能性があると思います。

あなたができることはそのようなものを持つことです:

String str = "outer string "inside a quote" ";
String newStr = "\"" + str.replaceAll("\"","") + "\";

上記のコードは、すべての引用符を削除し、文字列の最初と最後に引用符を追加します。

編集:

私はこれを思いついた、それは少し複雑ですが、それはうまくいくようです:

String str = "sdsadsaasdasdsadas\"sadsad\"the is sparta\"asdsadsa\"sdassa";
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);

それは以下をもたらします:

sdsadsaasdasdsadas"sadsadthe is spartaasdsadsa"sdassa

上記の正規表現は、基本的にテキストを3つのセクションに分割します。最初の引用符のセットの前の部分、内側の引用符の間のセット、および内側の引用符の後のセクションです。次に、文字列を再構築します。

編集:

このコードを使用してファイルから文字列を読み取りました(この場合の文字列は1ライナーであることに注意してください)

Scanner input = new Scanner(new File(filePath));
StringBuilder sb = new StringBuilder();
while (input.hasNextLine())
{
    sb.append(input.nextLine().trim()).append(" ");
}
input.close();
String str = sb.toString().trim();
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);

それは以下をもたらしました:

「引用符内の外側の文字列」

于 2012-07-25T12:25:51.383 に答える