我正在使用dk.brics.automaton工具。我正在使用一个我有正则表达式的文件。我想计算所有这些正则表达式的DFA状态。例如,我有这个RE "/^\x3c(REQIMG|RVWCFG)\x3e/ism"
,我将它带入字符串数组retval [0]。代码工作得很好,但问题是当我没有使用任何文件进行读取时,只是在RegExp函数中将其传递给RE,然后它表示无效的escape.So,当我将RE写为
时
"/^\\x3c(REQIMG|RVWCFG)\\x3e/ism"
然后它不会给我错误。
我不知道为什么当我从文件
中读取RE时,我没有得到这个无效的转义 String line = null;
String retval[];
int j=0;
try {
FileReader fileReader =new FileReader(fileName);
BufferedReader bufferedReader =new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null) {
retval= line.split("\t");
int i=0;
for(i=0;i<retval.length;i++){
try{
j=j+1;
RegExp r = new RegExp(retval[i],ALL);
Automaton a = r.toAutomaton();
System.out.println("RE : "+retval[i]);
System.out.println("States"+a.getNumberOfStates());
}
catch(Exception ex)
{
}
}
}
答案 0 :(得分:3)
在Java中,文字字符串中的反斜杠\
表示转义序列。因此它对编译器有特殊意义。这就是为什么,为了告诉编译器你需要反斜杠来表示实际的反斜杠(而不是“转义序列器”),你需要使用另一个反斜杠再次显式地转义它。
为什么文字字符串中出现错误?
在您的示例中,当编译器遇到..\x...
时,它将第一次出现的反斜杠\
视为转义序列发生器,但后来发现x
不构成valid escape sequence.因此错误。这就是为什么你在这样的文字字符串中使用时必须逃避\
:\\x
:"/^\\x3c(REQIMG|RVWCFG)\\x3e/ism"
为什么从文件中读取时没有错误?
但是,在从文件读取时,您不处理文字,因此存储在变量中的字符串不需要任何“转义”,因为编译器可以轻松地将文件中的所有数据视为逐字字符串。因此,您不必在此处转义反斜杠并保持正则表达式:/^\x3c(REQIMG|RVWCFG)\x3e/ism
旁注:
不幸的是,Java没有像.NET那样的verbatim string literals。例如,在.NET中,您可以像下面一样逐字地创建字符串also this。
RegExp(@"/^\x3c(REQIMG|RVWCFG)\x3e/ism",...)
答案 1 :(得分:2)
"\x"
是无效的转义序列。你必须逃避反斜杠:"\\x"
。
字符串文字"\\x"
表示包含\x
的字符串。您只需要在代码中转义它,但是当您从文件中读取\x
时,就没有问题。
假设您的文件只包含下一行(没有前导或尾随空格)
\x
并且您将文件的内容读入字符串:
String fileContent = readFileContent();
现在
boolean equal = "\\x".equals(fileContent);
equal
将为true
。