从文件中读取正则表达式

时间:2013-06-27 19:07:19

标签: java regex

我正在使用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)
                    {
                    }

            }   

        }

2 个答案:

答案 0 :(得分:3)

A character preceded by a backslash (\) is an escape sequence and has special meaning to the compiler.

在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