我有一个ASCII文本文件我试图使用正则表达式来解析Java。文件示例:
09-JUN-15 22:33 Eq:1 P1010030 1 HPCT: 0.0 RlTqCur:532 RlTqMin:-266 RlTqMax:270 ESMIN:2 ESMAX:2
我构建了我的表达式,但我想我可能会遇到一个可能失控的正则表达式案例。我的while (m.find())
循环永远不会终止。
我的正则表达式很长。以下是问题区域:"(esmin:)(?<esmin>\\d+)"
当我从表达式中删除(esmin:)
时,while循环按预期终止。我打破了正则表达式规则吗?我不知道为什么我有困难。
谢谢。
编辑:修复了丢失的&#34;)&#34;对不起,这不是问题所在。是的,我在模式中使用不区分大小写的标志。这是一些代码:
Pattern p = Pattern.compile(regexData.getJobDataType1(),Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(fileData);
while (m.find()) {
}
EDIT2:下面stribizhev指出的问题是,fileData
中读取的字符串实际上是整个ASCII文件。
答案 0 :(得分:1)
由于您的预期值位于一行上,因此您可以更加安全地逐行读取整个输入。
使用BufferedReader
。
举个例子:
BufferedReader reader = ...; // initialize the reader
String line = null;
Pattern p = Pattern.compile(regexData.getJobDataType1(),Pattern.CASE_INSENSITIVE);
while ((line = reader.readLine()) != null)
{
Matcher m = p.matcher(line);
while (m.find()) {
// Process the match
}
}
请注意,Pattern.DOTALL
修饰符仅更改模式内点的行为,而不匹配输入字符串中的点。由于您的模式为(esmin:)(?<esmin>\\d+)
,即它内部没有句点,因此修饰符是多余的。如果您需要匹配浮点值(不只是整数值),请使用[+-]?\\d*\\.?\\d+
代替\\d+
。