如何在 Java 中转义单个正则表达式元字符?
对于 Android 应用程序,我正在处理包含许多正则表达式认为具有特殊含义的字符的文件。这些包括 \?.()[*\^+'
和 -
。我将阅读两个文件:
- 字典中的单词列表,每个单词占一行。
- 可用于过滤字典列表中单词的字符列表。
每个示例如下。
字典:
/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/