理想情况下,我的正则表达式应捕获/提取以下所有数字格式:
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?)
答案 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 +序列,
- 0+空格的可选序列+ (?:\s*k)?
/ k
K
- 可选序列:
(?:\s*(?:\p{Pd}|to)\s*\d+(?:[.,]\d+)?(?:\s*k)?)?
- 任何包含0 +空格的短划线(\s*(?:\p{Pd}|to)\s*
)或\p{Pd}
to
- 见上文。