2016-10-30 9 views
0

データ処理ジョブとエスケープされていないデータを間違って実行しました。それはすべてのutf-8のように置き換えた\x0a\xfa to x0axfa xの前に\を置く正規表現を書いてみたい。それは\との最後の2つの文字の前に、すべてを置き換える、しかし正規表現を使用してutf8をエスケープします

`regex:((\([\x00-\x7F]\)|\w){2})+` 
replace with: \\$1 

:私はこれを試してみました。この問題を解決する正しい方法は何ですか? (私は再びデータ処理を行うことができない、正規表現を置き換えるしなければならない。その巨大なを。。)

入力:何とか何とかx0ax0fx12 ...

所望の出力:何とか何とか\ X0A \ x0f \ X12 ...

+0

今、手助けすることは不可能です。 'x [a-fA-F0-9] {2}'は '\\ $ 0'で置き換えようとするかもしれませんが、あなたが必要以上に置き換えないという保証はありません。 –

+0

"厳密"と "斧"だけのような言葉を残しておくのに十分なスマートな正規表現を書くのは苦労します。 – VGR

答えて

0

この場合、(x[0-9A-Fa-f]{1,4})+のような式を使用して、各行にバックスラッシュを付けずにUTF-8データのチャンクを識別します。

そこから、Javaのstring.split( "x")を使用して、 "x"のないバイトを表す文字列の配列を作成できます。これは、出力すべき「\ X0A \ x0f X12 \」

import java.io.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class Test { 
    public static void main(String args[]) { 
     String inputText = "blah blah x0ax0fx12 blah blah"; 
     String regexMatch = ""; 
     Pattern pattern = Pattern.compile("(x[0-9A-Fa-f]{1,4})+"); 
     Matcher matcher = pattern.matcher(inputText);     
     if (matcher.find()) { 
      regexMatch = matcher.group(0); 
     }     
     String replacedOutput = ""; 
     for (String splitStr : regexMatch.split("x")) {    
      if (!splitStr.equals("")) {     
       replacedOutput += "\\x" + splitStr; 
      }    
     }   
     System.out.println(replacedOutput); 
    } 
} 

、あなたはそれを代用することができるはずです:regexMatchは「x0ax0fx12」のようなあなたの表現から試合を含む文字列をある場合は、このような何かを行うことができますマッチャーがファイルを見つけた時点でファイルにマッチした行に戻ってください。

1

すでにものをエスケープエスケープ防ぐために、背後にあるデザインを使用し、スラッシュのための挿入ポイントを見つけるために、先読み:

str = str.replaceAll("(?<!\\\\)(?=x[a-z0-9]{2,})", "\\\\"); 

四重のバックスラッシュは、Javaの正規表現リテラルのバックスラッシュのために必要とされます。正規表現のために一度エスケープされた後、文字列リテラルのために再びそれぞれエスケープされます。

関連する問題