修复正则表达式以提取特定数字格式

时间:2016-09-16 08:51:22

标签: ruby regex

理想情况下,我的正则表达式应捕获/提取以下所有数字格式:

500 / 500.55 / 500k / 500.55k / 500到600 / 500k到600k / 500至600k / 500.55至600.55 / 500.55至600.55 k

我目前的正则表达式有问题,因为如果文本中有“700,000”或“800,000”或“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?)

1 个答案:

答案 0 :(得分:1)

我建议使用更多可选组而不是连续的可选原子,并使用[,.]字符类而不是\.来允许2个分隔符,\p{Pd}匹配任何短划线:< / p>

/\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+ - 一位或多位
  • (?:[.,]\d+)* - {+ 1}}或.的0 +序列
  • 后面有1位或更多位数
  • , - 0+空格的可选序列+ (?:\s*k)? / k
  • K - 可选序列:
    • (?:\s*(?:\p{Pd}|to)\s*\d+(?:[.,]\d+‌​)?(?:\s*k)?)? - 任何包含0 +空格的短划线(\s*(?:\p{Pd}|to)\s*)或\p{Pd}
    • to - 见上文。