java - 转义字符类中的单个字符

标签 java android regex escaping

如何在 Java 中转义单个正则表达式元字符?

对于 Android 应用程序,我正在处理包含许多正则表达式认为具有特殊含义的字符的文件。这些包括 \?.()[*\^+'- 。我将阅读两个文件:

  1. 字典中的单词列表,每个单词占一行。
  2. 可用于过滤字典列表中单词的字符列表。

每个示例如下。

字典:

 /it*
 t1*]
 ?\<t
 item

(是的,这些是单词。前三个是单词“stitch”、“teacher”和“thought”的缩写 Braille ASCII 表示。现在你知道了。)

要使用的“字母”:

?]*/\<1eitm

我想将这些字母包含在与此类似的正则表达式中:

String letters = "?]*/\<1eitm";
Pattern pattern = Pattern.compile("^["+letters+"]{4}$", Pattern.MULTILINE);

我的目标是从字典列表中选择所有只包含给定字符的单词是给定的长度。我无法控制请求的字符在文件中出现的顺序。

如果我只使用非元字符,比如 <1eitm ,这很好用。不知何故,我需要转义元字符并确保 ]- 等字符出现在方括号内的正确位置。

我可以手动执行此操作...但我希望有一个内置命令可以帮我执行此操作。到目前为止,我只找到了 Pattern.quote() 命令,它没有给我想要的结果。

下面列出了我可能需要在方括号内使用的所有字符:

\_-,;:!?.'"()[]@*/\&#%^+<=>~$0123456789abcdefghijklmnopqrstuvwxyz

这是我用于 Android 测试的准系统代码:

package com.example.quote;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AssetManager am = this.getAssets();
        try {
            String dictionary = readFile(am, "dictionary.txt");
            String regex = readFile(am, "regex.txt");

            regex = "^["+regex+"]{4}$"; // THIS IS WHERE I NEED TO MAKE A CHANGE

            Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
            Matcher matcher = pattern.matcher(dictionary);

            while (matcher.find()) {
                Log.d("TEST", matcher.group(0));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String readFile(AssetManager am, String fileName) throws IOException {
        InputStream is = am.open(fileName);

        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();

        String string = new String(buffer, "UTF-8");

        return string;
    }
}

最佳答案

使用Pattern.quote()引用所有特殊字符并使它们与文字字符匹配。该函数通常通过用引号 \Q...\E 构造包围提供的 String 来实现。

在 Oracle/OpenJDK(引用)实现中,用 \Q...\E 构造包围字符串,引用的构造在 Java 6 的字符类中被识别,因此返回值可以在字符类中使用。

Android 使用ICU implementation ,根据文档,它还允许 \Q\E 在字符类中工作。因此,无论 Pattern.quote() 函数在 ICU 中如何工作(添加转义 \ 或使用引号 \Q...\E构造),在这方面它的工作方式应该类似于引用实现 (Java 6)。

regex = "^[" + Pattern.quote(regex) + "]{4}$";

关于java - 转义字符类中的单个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27791187/

相关文章:

java - Payara/GlashFish 不会在 NetBeans 中启动

java - 如何使用每个条形的 Achartengine 在条形图中的条形之间留出空间是包含不同值的不同颜色

android - 按钮文本颜色未更改

java - 使用 CSS Parser 和 Regex (Java) 替换 CSS 中的 url

java正则表达式行

正则表达式范围运算符

java - 使用 Jackson 从 URL 映射 JSON

java - 多个 Spring-Boot (Web) 项目

java - JSP 上不显示操作错误

android - 如果 AsyncTask 不是内部类... - 一些问题