我一直在尝试使用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
谢谢
答案 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