我想寫一個正則表達式匹配一串數字正好12次(可能有一個額外的數字在字符串的開始,然後我想丟棄)。正則表達式的煩惱
我寫這個正則表達式時,他們都喜歡123.0123匹配這些數字(\ d + \ d +)。
String str3 = "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("^(\\d+\\.\\d+\\s)?((\\d+\\.\\d+\\s*?){12})$"); Matcher m = dataLinePattern.matcher(str3); if (m.matches()) { System.out.println(m.group(2)); }
預期成果是:
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})$"
使小數位可選,正則表達式切斷第一號,並打印僅在過去的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個數字是可選的時,正則表達式引擎將返回並查找匹配並且發現最後一個數字將匹配兩次:0和0487(在本示例中)
重新排列正則表達式以將每個數字開頭的標籤,而不是每個數字末尾的「可能」,這使得它可以工作。
Pattern.compile("([0-9.]+\t)?(([0-9.]+)(\t[0-9.]+){11})");
工作對我來說.. – 2014-09-24 17:44:08
它工作正常,檢查http://regex101.com/r/ uO1lR6/1 – 2014-09-24 17:45:26
第一個代碼塊中的代碼有效,你是否嘗試使用下面的2個替代正則表達式? (由於某些原因,它們沒有以正確的java格式粘貼,所以你不得不加入反斜槓) – 2014-09-24 18:02:58