2

提供されたリストにないものを置き換えたい

[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ ]

\バックスラッシュが置き換えられないように、このリストにバックスラッシュを含めたいと思います。このままあげたら

.replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")

期待どおりに機能しません。

"xyda\asff"..replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")

Expected result :: xyda\asff
Output :: xydaasff

交換したくありません\

4

4 に答える 4

4

2 つのレベルのエスケープを適用する必要があります。1つは正規表現自体用で、もう 1 つは Java 文字列リテラル用です。つまり、 4 つのバックスラッシュが連続して必要です。そう:

replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/\\\\ ]", "")

実際にリストに入れるので\\dはなく、任意の数字をカバーすることを意図していたと思いますか?d

パターンをコンソールに出力するのが最も簡単な場合があるため、Java 文字列リテラルのエスケープが関係なく、正規表現エンジンが認識する内容を正確に確認できます。上記のパターンは次のとおりです。

[^-\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\:;<,>.?/\\ ]

したがって、バックスラッシュ付きのビットは次のとおりです。

  • \d(桁)
  • \:(結腸)
  • \\(バックスラッシュ)
于 2013-08-29T06:00:12.777 に答える
3

単一のリテラル バックスラッシュを正規表現でコーディングするには、コード内に4 つのバックスラッシュ ( )が必要\\\\です (最後の文字を参照)。

[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ \\\\]

バックスラッシュの各ペアは、文字列内の単一のバックスラッシュであり、正規表現でさらにエスケープされるように 2 つ必要です。あなたはエスケープをエスケープする必要があります。


Java でこの目障りなコーディングから逃れることはできるでしょうか? (そこでしゃれを一生懸命にしようとしています)

于 2013-08-29T06:00:03.770 に答える
1

別のスラッシュを使用してスラッシュをエスケープする必要があります。そう\なる\\

正規表現については、もう一度エスケープする必要があると思います...

.replaceAll("[^-\\dA-Za-zÂÃâ~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
                ^^                            ^^

\スラッシュも含める必要がある場合は、次のようにエスケープする必要があります\\\\

于 2013-08-29T05:59:00.177 に答える
1

コードで文字列リテラルとして提供される Java 正規表現でリテラル バックスラッシュを使用するには、4 つのバックスラッシュが必要です。

\\\\

これは、実際の正規表現になりたいためです\\が、コンパイラは \ も文字列リテラルのエスケープとして見なすため、実行時に実際の文字列に変換するには、それぞれをもう一度エスケープする必要があります!

于 2013-08-29T06:00:16.887 に答える