Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式烦恼_Java_Regex - Fatal编程技术网

Java 正则表达式烦恼

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}

我正在尝试编写一个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}$”

为了使小数位数可选,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