转义字符中的单个字符 class
Escaping individual characters in a character class
如何在 Java 中转义单个正则表达式元字符?
对于 Android 应用程序,我正在处理包含许多正则表达式认为具有特殊含义的字符的文件。其中包括 \?.()[*\^+'
和 -
。我将阅读两个文件:
- 词典中的单词列表,每个单词占一行。
- 可用于过滤字典列表中单词的字符列表。
每个示例如下。
字典:
/it*
t1*]
?\<t
item
(是的,这些是单词。前三个是单词 "stitch"、"teacher" 和 "thought" 的缩写 Braille ASCII 表示。现在你知道了。 )
"Letters" 使用:
?]*/\<1eitm
我想将这些字母包含在与此类似的正则表达式中:
String letters = "?]*/\<1eitm";
Pattern pattern = Pattern.compile("^["+letters+"]{4}$", Pattern.MULTILINE);
我的目标是 select 字典列表中仅包含给定字符 和 的所有单词都是给定的长度。我无法控制请求的字符在文件中出现的顺序。
如果我只使用非元字符,例如 <1eitm
,则效果很好。不知何故,我需要转义元字符并确保 ]
和 -
等字符出现在方括号内的正确位置。
我可以手动执行此操作...但我希望有一个内置命令可以为我执行此操作。到目前为止,我所发现的只是 Pattern.quote()
命令,它没有给我想要的结果。
下面列出了我可能需要在方括号内使用的所有字符:
\_-,;:!?.'"()[]@*/\%^+<=>~23456789abcdefghijklmnopqrstuvwxyz
这是我用于 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;
}
}
转义 Java 正则表达式的特殊字符很烦人,但并不困难。原因是反斜杠字符\
在Java字符串中是转义字符,所以文字串“\”是反斜杠。但是单反斜杠也是正则表达式中的转义字符,所以在 Java 正则表达式模式匹配字符串中,特殊字符应该是 "escaped" 加双反斜杠!因此,为了匹配问号字符 ?
,您的正则表达式必须包含 \?
。要匹配单个反斜杠,您的正则表达式必须包含 \\
.
我们以你的String
为例:
String letters = "?]*/\<1eitm";
此处的前五个字符应进行转义 - 即以双反斜杠转义序列作为前缀 \
:
String letters = "\?\]\*\/\\<1eitm";
反斜杠本身,正如上面指出的,必须以转义序列为前缀,然后自身加倍。
希望对您有所帮助。
使用Pattern.quote()
将所有特殊字符都用引号引起来,使它们匹配文字字符。该函数通常是通过用引号 \Q...\E
结构包围提供的字符串来实现的。
在 Oracle/OpenJDK(参考)实现中,用 \Q...\E
构造包围字符串,引用的构造在字符 class 中从 Java 6 中识别出来,因此返回值可以在字符 class.
内使用
Android 使用 ICU implementation,根据文档,它还允许 \Q
和 \E
在字符 class 内工作。因此,无论 Pattern.quote()
函数在 ICU 中如何工作(添加转义 \
或使用引号 \Q...\E
构造),它的工作方式应该类似于参考实现 (Java 6)在这方面。
regex = "^[" + Pattern.quote(regex) + "]{4}$";
如何在 Java 中转义单个正则表达式元字符?
对于 Android 应用程序,我正在处理包含许多正则表达式认为具有特殊含义的字符的文件。其中包括 \?.()[*\^+'
和 -
。我将阅读两个文件:
- 词典中的单词列表,每个单词占一行。
- 可用于过滤字典列表中单词的字符列表。
每个示例如下。
字典:
/it*
t1*]
?\<t
item
(是的,这些是单词。前三个是单词 "stitch"、"teacher" 和 "thought" 的缩写 Braille ASCII 表示。现在你知道了。 )
"Letters" 使用:
?]*/\<1eitm
我想将这些字母包含在与此类似的正则表达式中:
String letters = "?]*/\<1eitm";
Pattern pattern = Pattern.compile("^["+letters+"]{4}$", Pattern.MULTILINE);
我的目标是 select 字典列表中仅包含给定字符 和 的所有单词都是给定的长度。我无法控制请求的字符在文件中出现的顺序。
如果我只使用非元字符,例如 <1eitm
,则效果很好。不知何故,我需要转义元字符并确保 ]
和 -
等字符出现在方括号内的正确位置。
我可以手动执行此操作...但我希望有一个内置命令可以为我执行此操作。到目前为止,我所发现的只是 Pattern.quote()
命令,它没有给我想要的结果。
下面列出了我可能需要在方括号内使用的所有字符:
\_-,;:!?.'"()[]@*/\%^+<=>~23456789abcdefghijklmnopqrstuvwxyz
这是我用于 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;
}
}
转义 Java 正则表达式的特殊字符很烦人,但并不困难。原因是反斜杠字符\
在Java字符串中是转义字符,所以文字串“\”是反斜杠。但是单反斜杠也是正则表达式中的转义字符,所以在 Java 正则表达式模式匹配字符串中,特殊字符应该是 "escaped" 加双反斜杠!因此,为了匹配问号字符 ?
,您的正则表达式必须包含 \?
。要匹配单个反斜杠,您的正则表达式必须包含 \\
.
我们以你的String
为例:
String letters = "?]*/\<1eitm";
此处的前五个字符应进行转义 - 即以双反斜杠转义序列作为前缀 \
:
String letters = "\?\]\*\/\\<1eitm";
反斜杠本身,正如上面指出的,必须以转义序列为前缀,然后自身加倍。
希望对您有所帮助。
使用Pattern.quote()
将所有特殊字符都用引号引起来,使它们匹配文字字符。该函数通常是通过用引号 \Q...\E
结构包围提供的字符串来实现的。
在 Oracle/OpenJDK(参考)实现中,用 \Q...\E
构造包围字符串,引用的构造在字符 class 中从 Java 6 中识别出来,因此返回值可以在字符 class.
Android 使用 ICU implementation,根据文档,它还允许 \Q
和 \E
在字符 class 内工作。因此,无论 Pattern.quote()
函数在 ICU 中如何工作(添加转义 \
或使用引号 \Q...\E
构造),它的工作方式应该类似于参考实现 (Java 6)在这方面。
regex = "^[" + Pattern.quote(regex) + "]{4}$";