0

以下に示すように、コロン(:)を疑問符()に置き換える正規表現が必要?です。
ただし、コロンが一重引用符( )内にある場合は、コロンを保持する必要があります。'

たとえば、次の入力文字列:

(:a、:abc、':colon、およびコンマで引用'、:more)

次のように変更する必要があります。

(?a、?abc、':colon、およびコンマで引用' 、? more)
4

3 に答える 3

2
String str = "(:a,:abc,'quoted with :colon, and comma',:more)";
StringBuffer sb = new StringBuffer();
boolean inQuote = false;
for (char c : str.toCharArray()) {
    if (c == '\'') {
        inQuote = !inQuote;
        sb.append(c);
    } else if (inQuote) {
        sb.append(c);
    } else if(c == ':') {
        sb.append('?');
    } else {
        sb.append(c);
    }
}
str = sb.toString();
System.out.println(str);

の期待される出力を生成し(?a,?abc,'quoted with :colon, and comma',?more)ます。ただし、明らかに正規表現を使用していません。また、引用符のエスケープを許可すると、私のソリューションが失敗することを覚えておいてください。

于 2013-01-22T17:26:16.740 に答える
1

:後に続くすべてを置き換えることができます。少なくともこの場合は機能します:-even numbersquotes (')

String str = "(:a,:abc,'quoted with :colon, and comma',:more)";     
str = str.replaceAll("[:](?=(?:[^']*'[^']*')*[^']*$)", "?");

System.out.println(str);

出力:-

(?a,?abc,'quoted with :colon, and comma',?more)

したがって、すべての開始引用符に対して終了引用符がある場合、の:内部にquotes偶数が続くことはありません。したがって、。に置き換えられることはありません。quotes?

于 2013-01-22T17:35:54.687 に答える
1

これは、で機能する別のソリューションですreplaceAll

生の正規表現:

((?:^\(|\G)(?: *'(?:[^'\\]|\\.)*' *,| *[^:' ][^,]* *,)* *):([^,]* *(?:,|\)$))

引用文字列(で使用replaceAll):

"((?:^\\(|\\G)(?: *'(?:[^'\\\\]|\\\\.)*' *,| *[^:' ][^,]* *,)* *):([^,]* *(?:,|\\)$))"

交換(で使用replaceAll):

"$1?$2"

サンプル入力:

(:a、:abc、':colon、およびコンマで引用'、skdhfks'sdfkdf、:sdf、' sdfds \'f'、:sdfksdf、sdkhfksd、:dfsd、sdfk'fjsdhfkf、' werwer'、:sdf、 :Sdf、skhfskjdf、'asdads \':asdkahsd ad')

サンプル出力:

(?a、?abc、':colon、およびコンマで引用'、skdhfks'sdfkdf、?sdf、' sdfds \'f'、?sdfksdf、sdkhfksd、?dfsd、sdfk'fjsdhfkf、' werwer'、?sdf、 ?Sdf、skhfskjdf、'asdads \':asdkahsd ad')

基本的に、前後のスペース,は自由に許可されます。'が最初の文字でない場合は、引用符で囲まれた文字列とは見なされません。'引用符で囲まれた文字列内でエスケープできます。実際には、あらゆる種類のエスケープ\が許可されています。空の引数は許可されていません。例:(:a, , :b)

デモ

あなたのテキストの詳細な仕様なしで、あなたが見ることができるように、私はここでいくつかの野蛮な仮定をするだけです。

説明

説明を簡単にするため。いくつかのキャプチャグループを削除します()。これは、置換にのみ役立ちます。

(?:^\(|\G)(?: *'(?:[^'\\]|\\.)*' *,| *[^:' ][^,]* *,)* *:[^,]* *(?:,|\)$)

それを分離します(一部の行の前にスペースがあり、正規表現の一部であることに注意してください):

(?:^\(|\G)
(?:
 *'(?:[^'\\]|\\.)*' *,
|
 *[^:' ][^,]* *,
)*
 *:[^,]* *
(?:,|\)$)

正規表現の各一致には、置換してはならないトークンと、置換が必要な単一のトークンが含まれます。

正規表現は、文字列の先頭で(?:^\(|\G)一致(する、または最後の一致の位置から続く、で始まり\Gます。

置換してはならないトークンは、引用符で囲まれた文字列'(?:[^'\\]|\\.)*'またはテキストシーケンスで、またはで[^:' ][^,]*始まりません。また、カンマは含まれません。、を使用して引用符で囲まれた文字列でエスケープすることを許可します。これは、任意の文字が後に続くことを意味します。に関心のないトークンをいくつでも許可します。':,\\.\*

いくつかのスペースの後に*、が続くことがわかります。これは、トークンの前後に任意のスペースを許可したことを意味します。

次に、関心のあるトークン::[^,]*

次に、正規表現はで終わります。これは、最後に(?:,|\)$)遭遇することを意味します。このエンディング部分は、が機能するために必要です。),\G

于 2013-01-22T17:59:09.153 に答える