0

我有以下文字:

&rule_c(2-7, <<'EOF');
cout << "Hello World.\n";
return x;
EOF

我想将此文本匹配为正则表达式。

我正在考虑的一个是:

^&rule_c\((\d+)\-(\d+),\s?\<\<\s?\'EOF\'\);\r?\n|\r\n?(.*\r?\n|\r\n?)+EOF\r?\n|\r\n?$

我用Java试过:

private static final String newLine = System.getProperty("line.separator").toString();
 ...
String textual = "&rule_c(2-7, <<'EOF');" + newLine
 + "cout << "Hello World.\n";" + newLine
 + "return x;" + newLine
 + "EOF" + newLine;

String lineSep = "\\r?\\n|\\r\\n?";
String regex = "^&rule_c\\((\\d+)\\-(\\d+),\\s?\\<\\<\\s?\\'EOF\\'\\);"
  + lineSep + "(.*" + lineSep + ")+EOF" + lineSep + "$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(textual);
if (m.matches()) {
    rangeLowerBound = Integer.parseInt(m.group(1));
    rangeUpperBound = Integer.parseInt(m.group(2));


    String[] tmp = m.group(3).split(lineSep);
    System.out.println(tmp.toString());
    for (String l : tmp)
        System.out.println(l);

    lineSet = new ArrayList<String>();
    Collections.addAll(lineSet, tmp);

} else
    System.out.println("regex doesn't match!");
 ...

我得到的唯一结果是regex doesn't match!.

我哪里失败了?

4

4 回答 4

1

|in\\r?\\n|\\r\\n?将整个正则表达式拆分为单独的部分regex1|regex2。要解决此问题,您可以将其放在括号中。此外,由于您不想将其包含在您的组数中,您可以使用它(?:...)来创建非捕获组。

所以改变

String lineSep = "\\r?\\n|\\r\\n?";

String lineSep = "(?:\\r?\\n|\\r\\n?)";

Arrays.toString(yourArray)顺便说一句,打印你不应该使用的数组内容,yourArray.toString()所以可能会改变

System.out.println(tmp.toString())

System.out.println(Arrays.toString(tmp))
于 2013-10-09T15:47:07.813 回答
0

我使用String lineSep = (?:\\r?\\n|\\r\\n?)+;(而不是String lineSep = [\\r?\\n|\\r\\n?]+;实际匹配|?字符)来解决,结合来自Pshemo(主要)和Fedor Skrynnikov 的答案和建议。

还“使用波西米亚人的建议来消除不必要的字符转义。

是来自gskinner.com的 RegEx Tester 的示例。

于 2013-10-10T12:49:35.490 回答
0

我认为您的问题出在行分隔符中。从您的代码示例中,这对我有用。字符串也没有正确转义,我不得不从你的例子中转义双引号。

final String newLine = System.getProperty("line.separator").toString();

StringBuilder sb = new StringBuilder();
sb.append("&rule_c(2-7, <<'EOF');");
sb.append(newLine);
sb.append("cout << \"Hello World.\n\";");
sb.append(newLine);
sb.append("return x;");
sb.append(newLine);
sb.append("EOF");
sb.append(newLine);
String textual = sb.toString();

String lineSep = "(\r?\n|\r\n?)";
String regex = "\\&rule_c\\(2\\-7, <<'EOF'\\);"+lineSep+"cout << \"Hello World.\\n\";"+lineSep+"return x;"+lineSep+"EOF"+lineSep;

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(textual);
if (m.matches()) {
    System.out.println("regex matches!");

}
else {
    System.out.println("regex doesn't match!");
}
于 2013-10-09T15:50:40.570 回答
0

使用“多行”正则表达式开关(?m),它也可以\s用来匹配换行符:

String regex = "(?m)^&rule_c\\((\\d+)-(\\d+),\\s?<<\\s?'EOF'\\);\\s(.*\\s)+EOF\\s$";

<还删除了,-和的不必要转义'

于 2013-10-09T15:52:02.517 回答