2016-09-16 54 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