2016-10-30 118 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正则表达式反斜杠四倍反斜线;为正则表达式逃脱一次,然后每一个字符串文字。