Java 正则表达式烦恼
我正在尝试编写一个regexp,它将与一个数字字符串精确匹配12次(在字符串的开头可能有一个额外的数字,然后我想放弃这个数字) 当这些数字都像123.0123(\d+。\d+)时,我编写了这个regexp来匹配这些数字 预期产出为: 0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487 然而,当我尝试像Java 正则表达式烦恼,java,regex,Java,Regex,我正在尝试编写一个regexp,它将与一个数字字符串精确匹配12次(在字符串的开头可能有一个额外的数字,然后我想放弃这个数字) 当这些数字都像123.0123(\d+。\d+)时,我编写了这个regexp来匹配这些数字 预期产出为: 0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487 然而,当我尝试像 “^(\d+[\.\d]?\t?)((\d+[\.\d]?\t*?){12}
“^(\d+[\.\d]?\t?)((\d+[\.\d]?\t*?){12}$”
或
“^(\d+(\.\d+)\t?(\d+(\.\d+)\t*?){12}$”
为了使小数位数可选,regexp将第一个数字切掉,只打印最后的11。。。我做错了什么
输出:
0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487
(缺失0.0503)
编辑:已解决。
问题归结为可选的制表符分隔符\t*?当该选项卡对于最后12个数字是可选的时,regexp引擎将返回并查找匹配项,并发现最后一个数字将匹配两次:0。和0487(在本例中)
重新排列regexp,将标签放在每个数字的开头,而不是在每个数字的末尾加上“maybe”,这样就可以工作了
Pattern.compile(([0-9.]+\t)([0-9.]+)(\t[0-9.]+){11})代码>尝试以下操作:
String str3 = "0.0 0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487";
Pattern dataLinePattern = Pattern
.compile(".*\\s+((\\d+(\\.\\d+)?)(\\s+(\\d+(\\.\\d+)?)){11})\\s*$");
Matcher m = dataLinePattern.matcher(str3);
if (m.matches()) {
System.out.println(m.group().trim().replaceAll("\\s+", " "));
}
它打印:
0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487
它工作得很好,检查第一个代码块中的代码是否工作,您是否尝试使用下面的2个备用regexp?(由于某些原因,它们没有以正确的java格式粘贴,因此您必须重新添加反斜杠)不喜欢那些贪婪的量词,但您引导我找到了正确的路径。Pattern dataLinePattern=Pattern.compile(([0-9.]+\\t)([0-9.]+)(\\t[0-9.]+){11});酷。但是第一组不是没有必要吗?你可以简单地把*
放进去。那么你应该用。*?实际上,第一个组是这样显式编写的,以使regexp运行得更快。“*”是贪婪的,实际上会匹配整行,然后regexp引擎将回溯整行中的每个字符,尝试匹配表达式的其余部分。这使得模式匹配效率大大降低。问题是,对于regexp,您应该始终尽可能明确,对于小文件,您可能看不到任何差异,但是对于大文件(想想30GB的基因组序列),差异可能会变得巨大。
0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487