Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获U+的正则表达式;Java中的XXXX(或\uxxx)字符_Java_Regex_Pattern Matching - Fatal编程技术网

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

捕获U+的正则表达式;Java中的XXXX(或\uxxx)字符,java,regex,pattern-matching,Java,Regex,Pattern Matching,我一直在尝试使用PDFBox创建PDF,但失败了,出现了如下错误: java.lang.IllegalArgumentException:U+0083在此字体的编码中不可用:WinAnScienceODing 我想知道是否有一种方法可以使用正则表达式捕获这些元素,我已经尝试使用 (\\[a-z]00[0-9][0-9]) 如果我使用RegexTool(比如RegexBuddy)进行验证,但在Java中不起作用,那么它似乎可以正常工作!我尝试过使用Java模式和Matcher,但没有成功。我对P

我一直在尝试使用PDFBox创建PDF,但失败了,出现了如下错误:

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

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

(\\[a-z]00[0-9][0-9])
如果我使用RegexTool(比如RegexBuddy)进行验证,但在Java中不起作用,那么它似乎可以正常工作!我尝试过使用Java模式和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Ã\u0093\u0083 ERCCÃ\u0099Ã


谢谢

我假设您希望匹配字面上的“\u0083”,而不是它所代表的unicode字符。

试试
(\\\\u00[0-9][0-9])

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

String patternString = "[\u0083|\u0082|\u0080]";
String patternString = "[\u0080-\u0090]";
或者对于这样的列表:

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

此正则表达式将找到所有
反斜杠
+
u
+
4位

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

发现:1:8-14

查询时间:2:17-23

发现时间:3:24-30

发现时间:4:31-37

发现:5:38-44

查询时间:6:51-57


我不确定您到底想在这里做什么,但是
“\u0083”
是一个表示一个字符而不是六个字符的字符。它不会被正则表达式
“.0083”
匹配,但会被
匹配

另外,
“\\”
表示Java字符串中的一个字符,即反斜杠;在正则表达式中,单个反斜杠转义以下字符。在本例中,
“\\[”
匹配一个文本开头方括号字符

但所有这些可能都无关紧要,因为像
这样的序列的存在表明你在错误处理UTF-8数据。特别是,似乎有人强迫每个字节都使用char值,而不是使用a正确解码字节。然后,同样的错误再次应用到新的、不正确的字符串上

反向工作时,这些字符:

ERCC Ã\u0099¢
对应于这些十六进制字节值:

45 52 43 43 20 c3 99 c2 a2
如果不强制每个字节值都是一个字符,而是将它们解码为UTF-8字节,则得到字符串
“ERCCÙÙ¢”
。如果我们再次将每个字符视为一个字节值,则得到:

45 52 43 43 20 d9 a2
如果我们再次使用UTF-8解码这些字节,我们会得到我猜是指的“ERCC٢”

如果修复了提取文本的代码,则可以将该字符串与类似于
Pattern.compile(“ERCC\\s*\\d+”,Pattern.UNICODE\u CHARACTER\u CLASS)的内容进行匹配