正则表达式捕获Java中的U + XXXX(或\ uXXXX)字符

时间:2017-10-12 13:45:01

标签: java regex pattern-matching

我一直在尝试使用PDFBox创建PDF,但它失败了,例如

  

java.lang.IllegalArgumentException:U + 0083在此字体的编码中不可用:WinAnsiEncoding

我想知道是否有一种方法可以使用正则表达式捕获这些元素,我尝试过使用,

(\\[a-z]00[0-9][0-9])

如果我验证使用RegexTool(如RegexBuddy)但在Java中不起作用,这似乎工作正常!我尝试过使用Java Patterns和Matcher但没有成功。我用Pattern Matcher完成的工作如下,

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherFindStartEndExample {

public static void main(String[] args) {

    String text    =
            "IMTECH Ã\u0083¢Ã\u0082Â\u0080Ã\u0093Â\u0083 " + 
            "ERCC Ã\u0099¢à PLANNED ";

    String patternString = "(\\[a-z]00[0-9][0-9])";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(text);

    int count = 0;
    while(matcher.find()) {
        count++;
        System.out.println("found: " + count + " : "
                + matcher.start() + " - " + matcher.end());
    }
  }
}

我现在的文字看起来像是,

  

IMTECHÃ\ u0083¢\ u0082 \ u0080 \ u0083 \ u0083 ERCCÃ\ u0099¢PLANNED

谢谢

4 个答案:

答案 0 :(得分:1)

我不确定您要在这里做什么,但"\u0083"Java escape sequence代表一个字符,而不是六个字符。它不会与正则表达式"..0083"匹配,但它将与"."匹配。

此外,"\\"表示Java字符串中的一个字符,反斜杠;在正则表达式中,单个反斜杠会转义后续字符。在您的情况下,"\\["匹配文字开头方括号字符。

但所有这些都可能无关紧要,因为像¢这样的序列的存在表明你错误地处理了UTF-8数据。特别是,看起来有人强迫每个字节都为char值,而不是使用Charset正确解码字节。然后第二次将同样的错误应用于新的,不正确的String。

向后工作,这些字符:

ERCC Ã\u0099¢

对应于这些十六进制字节值:

45 52 43 43 20 c3 99 c2 a2

如果不是强制每个字节值为char,而是将它们解码为UTF-8字节,则得到字符串"ERCC Ù¢"。如果我们再次将每个char视为字节值,我们得到:

45 52 43 43 20 d9 a2

如果我们再次使用UTF-8解码这些字节,我们得到"ERCC ٢",我猜是指ERCC2

如果您修复了提取文本的代码,则可以将该字符串与Pattern.compile("ERCC\\s*\\d+", Pattern.UNICODE_CHARACTER_CLASS)匹配。

答案 1 :(得分:0)

我假设你想要字面上匹配" \ u0083",而不是它代表的unicode字符。
试试(\\\\u00[0-9][0-9])

答案 2 :(得分:0)

您的patternString从字面上搜索文本而不是字符。 您可以搜索如下字符列表:

String patternString = "[\u0083|\u0082|\u0080]";

或者像这样的列表:

String patternString = "[\u0080-\u0090]";

答案 3 :(得分:0)

此正则表达式将找到所有backslash + u + 4 digits

String patternString = "[\\\\]+[u]+\\d{4}";

输出:

  

发现:1:8 - 14

     

发现:2:17 - 23

     

发现:3:24 - 30

     

发现:4:31 - 37

     

发现:5:38 - 44

     

发现:6:51 - 57