当前位置: 首页 > 知识库问答 >
问题:

Java模式/匹配器

武博艺
2023-03-14

这是一个示例文本:\1f\1e\1d\020028。我无法修改输入文本,我正在从文件中读取长字符串文本。

我想提取以下内容:\1f\1e\1d\02

为此,我编写了以下正则表达式模式:“\\[a-fA-F0-9]”

我正在使用PatternMatcher类,但是我的Matcher无法使用前面提到的正则表达式找到模式。我在一些在线regex网站上用文本测试了这个regex,令人惊讶的是,它在那里工作。

我哪里做错了?

原始代码:

public static void main(String[] args) {
    String inputText = "\1f\1e\1d\02002868BF03030000000000000000S023\1f\1e\1d\03\0d";
    inputText        = inputText.replace("\\", "\\\\");

    String regex     = "\\\\[a-fA-F0-9]{2}";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(inputText);

    while (m.find()) {
        System.out.println(m.group());
    }
}

输出:未打印任何内容

共有3个答案

吕新
2023-03-14

试着在末尾加一个.,比如:

\\[a-fA-F0-9].
商迪
2023-03-14

您需要正确读取文件,并将\字符替换为\\。假设您的项目中有一个名为test_file的文件,其内容如下:

\1f\1e\1d\02002868BF03030000000000000000S023\1f\1e\1d\03\0d

以下是读取文件和提取值的代码:

public static void main(String[] args) throws IOException, URISyntaxException {        
    Test t = new Test();
    t.test();
}

public void test() throws IOException {        
    BufferedReader br =
        new BufferedReader(
            new InputStreamReader(
                getClass().getResourceAsStream("/test_file.txt"), "UTF-8"));
    String inputText;

    while ((inputText = br.readLine()) != null) {
        inputText = inputText.replace("\\", "\\\\");

        Pattern pattern = Pattern.compile("\\\\[a-fA-F0-9]{2}");
        Matcher match = pattern.matcher(inputText);

        while (match.find()) {
            System.out.println(match.group());
        }
    }
}
终子昂
2023-03-14

(在OP添加更多细节后答案更改)

你的绳子

String inputText = "\1f\1e\1d\02002868BF03030000000000000000S023\1f\1e\1d\03\0d";

实际上不包含任何\文本,因为根据第3.10.6节中的Java语言规范。字符和字符串文本的转义序列\xxx将被解释为Unicode表中的字符索引,其八进制(基/基数8)值由xxx部分表示。

示例\123=1*822*813*80=1*64 2*8 3*1=64 16 3=83,代表字符S

如果你在问题中呈现的字符串在文本文件中写得完全相同,那么你应该将其写为

String inputText = "\\1f\\1e\\1d\\02002868BF03030000000000000000S023\\1f\\1e\\1d\\03\\0d";

(使用转义的\,现在将表示文字)。

(我回答的旧版本)

在没有看到代码的情况下,很难判断你到底做错了什么。你应该能够找到至少\1\1\1\0,因为你的正则表达式可以匹配一个\和一个放在它后面的十六进制字符。

无论如何,这就是你如何找到你在问题中提到的结果:

String text = "\\1f\\1e\\1d\\020028";
Pattern p = Pattern.compile("\\\\[a-fA-F0-9]{2}");
//                                          ^^^--we want to find two hexadecimal 
//                                               characters after \
Matcher m = p.matcher(text);
while (m.find())
    System.out.println(m.group());

输出:

\1f
\1e
\1d
\02
 类似资料:
  • 本文向大家介绍java模式匹配之蛮力匹配,包括了java模式匹配之蛮力匹配的使用技巧和注意事项,需要的朋友参考一下 java模式匹配之蛮力匹配 使用示例: 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常

  • 主机权限和 内容脚本匹配 是基于匹配模式定义的一组 URL。匹配模式本质上是一个以允许的 schema(http,https,file 或ftp 开头)的URL,并且可以包含 “*” 字符。特殊模式 < all_urls > 匹配以允许的 schema 开头的任何 URL。 每个模式包含 3 个部分: schema - 例如,http 或file 或 * 注意:对文件 URL 的访问不是自动的。用

  • MySQL提供了一个标准的SQL模式匹配,和基于扩展的正则表达式的模式匹配Unix工具(如vi,grep,sed)一样。 SQL模式匹配可以使用“_“来匹配任意单个字符,”%“可以用来匹配任意数量(包含0个字符)的字符。在MySQL中,SQL模式匹配的大小写默认是不敏感的,以下有一些例子,当你在使用SQL模式时,不要使用 = 或 <>,而是使用LIKE 或 NOT LIKE。 要找到以字符“b"开

  • 除了我们常见的控制语句之外,Rust还提供了一个更加强大的关键字——match 。但是,需要指出的一点是,match只是匹配,要发挥其全部威力,还需要模式的配合。本章,我们就将的对Rust的模式匹配进行一番探索。 本章内容: match关键字 模式 pattern

  • 模式匹配 内容脚本可以作用到模式匹配定义好的URL集合上. 你能对manifest文件的内容脚本段的部分进行一个或多个模式匹配操作. 这里描述模式匹配语法 — 当你指定内容脚本将影响哪些URL时你需要遵循的规则. 任意一个模式匹配本质上都是一个以认可的协议(例如:http, https, file, ftp 或者 chrome-extension)开头的URL,只是URL你可以包含"*"字符. 这