我有以下文字:
&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!
。
我失败的地方?
答案 0 :(得分:1)
|
中的 \\r?\\n|\\r\\n?
将您的整个正则表达式分割为单独的部分regex1|regex2
。要解决此问题,您可以将其放在括号中。此外,由于您不希望将其包含在群组计数中,因此您可以使用(?:...)
来设置非捕获群。
所以改变
String lineSep = "\\r?\\n|\\r\\n?";
到
String lineSep = "(?:\\r?\\n|\\r\\n?)";
BTW打印数组内容你应该使用Arrays.toString(yourArray)
而不是yourArray.toString()
所以可能会更改
System.out.println(tmp.toString())
到
System.out.println(Arrays.toString(tmp))
答案 1 :(得分: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!");
}
答案 2 :(得分:0)
使用“多行”正则表达式开关(?m)
,您可以使用\s
来匹配换行符:
String regex = "(?m)^&rule_c\\((\\d+)-(\\d+),\\s?<<\\s?'EOF'\\);\\s(.*\\s)+EOF\\s$";
同时删除了<
,-
和'
的不必要转义。
答案 3 :(得分:0)
我使用String lineSep = (?:\\r?\\n|\\r\\n?)+;
(而不是String lineSep = [\\r?\\n|\\r\\n?]+;
实际上匹配|
和?
字符)来解决,结合来自 Pshemo的答案和建议(主要)和 Fedor Skrynnikov 。
同时'使用波西米亚的建议删除不必要的字符转义。
Here来自gskinner.com的RegEx Tester的示例。