0

我正在使用 dk.brics.automaton 工具。我正在使用一个包含正则表达式的文件。我想计算所有这些正则表达式的 DFA 状态。例如,我有这个 RE "/^\x3c(REQIMG|RVWCFG)\x3e/ism" ,我把它放在字符串数组 retval[0] 中。该代码运行良好,但问题是当我不使用任何文件进行读取并且只是在函数 RegExp 中将其传递到 RE 上方时,它会说无效转义。所以,当我编写 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)
                    {
                    }

            }   

        }
4

2 回答 2

3

以反斜杠 (\) 开头的字符是转义序列,对编译器具有特殊意义。

在 Java 中,文字字符串中的反斜杠\表示转义序列。因此它对编译器具有特殊的意义。这就是为什么为了告诉编译器您需要反斜杠来表示实际的反斜杠(而不是“转义序列器”),您需要使用另一个反斜杠再次显式转义它。

为什么文字字符串中的错误?
在您的示例中,当编译器遇到..\x...它会将第一次出现的反斜杠\视为转义序列,但随后会发现x哪个没有形成有效的转义序列。因此错误。这就是为什么你必须\在像这样的文字字符串中使用 when 时\\x"/^\\x3c(REQIMG|RVWCFG)\\x3e/ism"

为什么从文件读取时没有错误?
但是,在从文件中读取时,您不会处理文字,因此存储在变量中的字符串不需要任何“转义”,因为编译器可以很容易地确定文件中的所有数据都将被视为逐字字符串。因此,您不必在这里转义反斜杠并保持正则表达式的原样:/^\x3c(REQIMG|RVWCFG)\x3e/ism

旁注:
不幸的是,Java 还没有像 .NET 那样的逐字字符串文字。例如,在 .NET 中,您可以像下面一样逐字制作字符串,也可以将这个.

RegExp(@"/^\x3c(REQIMG|RVWCFG)\x3e/ism",...)
于 2013-06-27T19:15:44.343 回答
2

"\x"是无效的转义序列。您必须转义反斜杠:"\\x".

String 字面量"\\x"表示包含\x. 您只需在代码中对其进行转义,但是当您\x从文件中读取时,不会有任何问题。

假设您的文件仅包含下一行(没有前导或尾随空格)

\x

并将文件的内容读入字符串:

String fileContent = readFileContent();

现在

boolean equal = "\\x".equals(fileContent);

equaltrue

于 2013-06-27T19:14:49.693 回答