2016-09-16 50 views
2

理想情況下我正則表達式應該捕獲/解壓以下所有數字格式:修復正則表達式來提取特定數字格式

500/ 500.55/ 500K/ 500.55k/ 500〜600/500K 到600K/ 500〜600K/ 500.55至600.55/ 500.55至600.55ķ

我有我目前正則表達式的一個問題,因爲如果像「700000」或「800000」或數字「8.54」是在文本,然後它分裂了數字和捕獲:

700,000 => "700","000" 
800,000. => "800" , "000." , "8.", "54" 
8.54 => "8.", "54" 

任何想法改變什麼?當前正則表達式:

(\d+(?:\.?\d*)?\s*k?(?:\-|to)\s*\d+(?:\.?\d*)\s*k?|\d+(?:\.?\d*)\s*k?) 
+0

確切地說:你仍然需要'500到600'作爲'500到600',而不是單獨的數字,對嗎? –

+0

對於像「700,000」,「800,000」或「8.54」'這樣的輸入應該會發生什麼? – Stefan

+0

嘗試'/ \ d +(?:[。,] \ d +)?(?:\ s * k)?(?:\ s *(?:\ p {Pd} | to)\ s * \ d + :[。,] \ d +)?(?:\ s * k)?)?/ i' –

回答

1

我建議使用更多的可選組,而不是連續的可選的原子,並利用[,.]字符類,而不是\.允許2層分離,並\p{Pd}匹配任何破折號:

/\d+(?:[.,]\d+)*(?:\s*k)?(?:\s*(?:\p{Pd}|to)\s*\d+(?:[.,]\d+‌​)*(?:\s*k)?)?/i 

Rubular demo

如果你想讓它更確切地說,(?:[.,]\d+)*應分成(?:\.\d+)*(?:\.\d+)?

/\d+(?:\.\d+)*(?:\.\d+)?(?:\s*k)?(?:\s*(?:\p{Pd}|to)\s*\d+(?:\.\d+)*(?:\.\d+)?(?:\s*k)?)?/i 

詳細

  • \d+ - 1或多個數字
  • (?:[.,]\d+)* - 後
  • (?:\s*k)?.,具有1個或多個數字0+序列 - 的可選序列0+空格+ k/K
  • (?:\s*(?:\p{Pd}|to)\s*\d+(?:[.,]\d+‌​)?(?:\s*k)?)? - 的可選序列: - 包圍0+空格
  • \d+(?:[.,]\d+‌​)*(?:\s*k)?任何破折號(\p{Pd})或to - 見上文
    • \s*(?:\p{Pd}|to)\s*
+0

謝謝您的回覆。但是,我認爲如果有一個像500,000.5的數字,那麼正則表達式不會匹配 – Vas

+0

然後,用'*'替換'?':'/\d+(?:[.,]\d+)*(?:\s*k) ????(:\ S *(:\ p {PD} |到)\ S * \ d +(?:[。,] \ d +)*(?:\ s * k)?)?/ i' –

+0

是的,但理想情況下它應該是\ d {1,3}(?:,\ d {3})+(?:\。\ d +)之類的東西。 – Vas