【发布时间】:2016-09-15 08:42:13
【问题描述】:
假设我有这样的事情:
pattern = new Pattern[6];
pattern[0] = Pattern.compile("^\\s*(NAME\\:\\s*)\\s(\\w+)");
pattern[1] = Pattern.compile("^\\s*(AGE\\:\\s*)\\s(\\d+)");
pattern[2] = Pattern.compile("^\\s*(ADDRESS\\:\\s)(\\w+)");
pattern[3] = Pattern.compile("^\\s*(BIRTHDAY\\:\\s)(\\d+)\\:(\\d+)\\:(\\d+)");
pattern[4] = Pattern.compile("(?=\\s*\\*)(^\\**)");
pattern[5] = Pattern.compile("\\S+|[^\\s*.+\\s*]");
模式 4 的要点是捕获后跟 * 的 cmets,模式 5 是捕获其他模式无法捕获的所有其他内容。然后 Matcher dp 将检查该模式是否是 LookAhead 预期返回 true 或 false 的模式。
public boolean lookAhead () {
while ((line = buff.readLine()) != null) {
Pattern different = Pattern.compile("^[^(\\s*NAME.*)(\\s*AGE.*)(\\s*ADDRESS.*)(\\s*BIRTHDAY.*)]");
Matcher comment = pattern[4].matcher(line);
Matcher diff = different.matcher(line);
Matcher name = pattern[0].matcher(line);
if (comment.find() || different.find() /*|| name.find()*/)
continue;
Matcher dp = pattern[0].matcher(line);
dpla = dp.find();
break;
}
}
return dpla;
}
cmets 会被忽略,并且所有随机错误(例如:“feifiejfie”)也会被忽略。但是,如果文本类似于“NAME 7987997 GSGSGE 456”,则应将其视为错误,但事实并非如此。如果 name.find 未注释,它将始终有效,但它永远不会返回 false。
【问题讨论】:
-
也许您还应该说出您输入的有效变体是什么样的;以及您的代码实际上应该做什么。我很难从您的正则表达式中扣除该逻辑。这已经稍微暗示了您当前的代码可能不太容易阅读。含义:我认为这里的解决方案是通过专注于你真正想知道的关于你的输入的事情来大幅修改你的代码。因此:请说明您的要求。
-
pattern[4]在我看来是错误的。它匹配“输入开始时的一个或多个星号”,并且大多数向前看是没有意义的;相当于"^\\*+" -
备案:如果我的回答对你有帮助,请告诉我;或者如果缺少某些东西......
-
@GhostCat 是的,谢谢你的回复,你的想法似乎很不错,但是我现在做了这么多,我需要很长时间来重组所有东西,我是几个小时前能够得到我自己问题的答案,请随时查看并告诉我您的想法,但我一定会牢记您对未来项目的想法。