1

次のJava正規表現は機能しているようです。目的は、escapeChar--backslashを削除することです"\"。それは"\\{"になるはず"{"です。

私の質問は

  1. 正規表現フィールドの10文字(閉じ括弧「)」は、char5で始まった正規表現グループを閉じていませんか?では、char10の閉じ括弧の後、これはcharに対してどのように機能しますか?
  2. 誰かが私のためにこの正規表現を分解できますか?

    str = str.replaceAll("\\\\([{}()\\[\\]\\\\!&:^~-])", "$1");
    
4

2 に答える 2

3

エスケープを削除した後、残りは

  \\([{}()\[\]\\!&:^~-])
     ^character class

ここでの文字クラス内のすべては、エスケープされている[,] およびを除いて、リテラルです。\

于 2012-11-14T23:43:58.067 に答える
3

正規表現フィールドの 10 文字 (閉じ括弧 ")" ではなく、char5 で始まる正規表現グループを閉じていますか? では、これは char10 の閉じ括弧の後の文字に対してどのように機能するのでしょうか?

いいえ。かっこは、 と の両方()、文字クラス内のメタ文字ではありません。文字クラス内では、これらの文字だけ^-[]\が特別な意味を持つことに注意してください。

キャレット ( ^) とダッシュ ( -) の場合、戦略的に char クラス内に配置すると、それらの特別な意味が失われます。キャレットが先頭以外に配置された場合はキャレット-、先頭または末尾に配置された場合は です。

誰かが私のためにこの正規表現を分解できますか?

Java で必要な二重エスケープを削除してみましょう。これは次のようになり\\\\([{}()\\[\\]\\\\!&:^~-])ます。

\\([{}()\[\]\\!&:^~-])   # the actual regex

これは次のように分類されます。

\\                   # match literal backslash
 (                   # open capture group
  [                  # open character class, matching any of
   {}()\[\]\\!&:^~-  # these characters: {}()[]\!&:^~-
  ]                  # close character class
 )                   # close capture group

基本的には、バックスラッシュに一致し、その後にこれらの文字のいずれかが続き{}()[]\!&:^~-、キャプチャ グループに入れます。このキャプチャ グループは置換 ( $1) で使用され、一致全体 (バックラッシュ + 文字) が文字自体に置き換えられます。

つまり、これにより、これらの特殊文字から先頭のバックスラッシュが削除されます。

于 2012-11-14T23:50:07.780 に答える