2016-10-30 119 views
0

我做了一個數據處理工作,並錯誤地轉義了數據。它取代了所有的utf-8像\x0a\xfa to x0axfa 我想寫一個正則表達式將這些\放回到x之前。我嘗試這樣做:使用正則表達式轉義utf8

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

然而,之前的最後2個字符與\代替一切。什麼是解決這個問題的正確方法。 (我需要做的正則表達式替換,不能再這樣做數據處理其龐大的。)

輸入:等等等等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」的字節。如果regexMatch是包含從你的表情像「x0ax0fx12」匹配的字符串,那麼你可以做這樣的事情:

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); 
    } 
} 

這應該輸出「\ X0A \ X0F \ X12」,你應該能夠替代它回到匹配器找到它的地方,匹配到文件中的行。

1

使用一看後面,以防止逃逸已經逃脫了的東西,並且向前看找到斜線插入點:

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

是需要在Java正則表達式反斜槓四倍反斜線;爲正則表達式逃脫一次,然後每一個字符串文字。