【发布时间】:2017-01-24 19:04:26
【问题描述】:
我想在我的方法中使用正则表达式解析格式如下所述的字符串,但是即使 RegExr 等在线 RegEx 工具显示我的表达式应该匹配它却不匹配。
我使用的表达式是(@(\\d+))[(\r\n)\n](((0|1){"+width+"}[(\r\n)\n]){"+height+"}),其中width 和height 是文本块所需宽度和高度的整数值。
我想从我的文件中检索的文本块的格式如下:
@200
0000000000
0000011001
1100100000
0101001101
1110001110
@500
0000000000
0000011001
1100100000
0101001101
1110001110
etc.
(这里,width 将是 10 和 height 5)
想要使用 Matcher.find() 方法来检索每个块,但表达式甚至找不到任何东西。
我怀疑我处理换行符的方式存在问题,但是当我想尝试使用新的 Java 8 \R 通用换行符转义字符时,Eclipse 显示错误“无效转义序列”。
【问题讨论】:
-
[(\r\n)\n]不会像您认为的那样做。这是一个将匹配(或\r或\n或)或\n的字符类。两次列出\n是没有意义的,所以写[()\n\r]意味着同样的事情。您可能打算使用\r?\n,这意味着\r\n或\n。 -
另外,你有太多的括号,除非你真的想捕捉所有这些。无需捕获,正则表达式应为
"@\\d+\r?\n(?:[01]{"+width+"}\r?\n){"+height+"}"。 -
或者只使用
\R来表示任何类型的换行符。 -
@Holger OP 已经尝试使用
\R,所以只是说使用它没有帮助。现在,告诉 OP 记住对字符串文字中的\进行 Java 转义会很有用,所以:Maximilian, 记住写\\R,因为\R是无效的 Java 转义序列,但"\\R"变为\R以供正则表达式引擎查看,并且 它 支持\R转义序列(在 Java 8+ 中)。 -
这就是 OP 没有显示实际源代码时的问题。所以不清楚我们是在谈论正则表达式语法还是 Java 字符串文字语法。在谈论 Java 源代码语法时,我通常使用
"\\R",而在谈论正则表达式语法(或任何其他类型的 DSL)时,我通常使用\R(不带引号)。真正的乐趣始于谈论生成或解析源代码,即需要"\"\\\\R\""...
标签: java regex eclipse parsing java-8