以下に示すように、コロン(:
)を疑問符()に置き換える正規表現が必要?
です。
ただし、コロンが一重引用符( )内にある場合は、コロンを保持する必要があります。'
たとえば、次の入力文字列:
(:a、:abc、':colon、およびコンマで引用'、:more)
次のように変更する必要があります。
(?a、?abc、':colon、およびコンマで引用' 、? more)
以下に示すように、コロン(:
)を疑問符()に置き換える正規表現が必要?
です。
ただし、コロンが一重引用符( )内にある場合は、コロンを保持する必要があります。'
たとえば、次の入力文字列:
(:a、:abc、':colon、およびコンマで引用'、:more)
次のように変更する必要があります。
(?a、?abc、':colon、およびコンマで引用' 、? more)
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)
ます。ただし、明らかに正規表現を使用していません。また、引用符のエスケープを許可すると、私のソリューションが失敗することを覚えておいてください。
の:
後に続くすべてを置き換えることができます。少なくともこの場合は機能します:-even numbers
quotes (')
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
?
これは、で機能する別のソリューションです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