如何用Groovy为地址字符串的数字添加空格(规避序数词异常)
问题需求
需要将地址字符串中的数字逐个用空格分隔,兼容所有常见地址格式。例如:
"1234 South St City, NY 12345" → "1 2 3 4 South St City, NY 1 2 3 4 5"
过往尝试与问题
- 尝试1:能实现数字分隔,但会错误处理"1st"这类带序数词的地址片段,给"1"和"st"之间添加空格,不符合需求
def address = "1234 South St City, NY 12345" address = address.replaceAll(/(\d)/, '$1 '); address = address.trim(); println(address);
- 尝试2-4:仅对长度3及以上的数字序列添加末尾空格,完全没实现逐个数字分隔的核心需求
// 尝试2 def address = "1234 South St City, NY 12345" address = address.replaceAll(/\d{3,}/, '$0 '); address = address.trim(); println(address); // 尝试3 def address = "1234 South St City, NY 12345" address = address.replaceAll(/(\d{3,})/, '$1 '); address = address.trim(); println(address); // 尝试4 def address = "1234 South St City, NY 12345" address = address.replaceAll(/\d{3,5}/, '$0 '); address = address.trim(); println(address);
解决方案
使用带正向预查的正则表达式,仅对后面是数字或非字母字符的数字添加空格,避免破坏序数词格式:
def address = "123 1st St NW Hampton, IA 12345" address = address.replaceAll(/(\d)(?=\d|[^a-zA-Z])/, '$1 ') address = address.trim() println(address)
正则逻辑说明
(\d):捕获单个数字(?=\d|[^a-zA-Z]):正向预查规则,确保当前数字的后续字符要么是另一个数字,要么是非字母字符(空格、逗号等),这样就不会匹配"1st"里的1(因为后面是字母s)
测试验证:
输入:"123 1st St NW Hampton, IA 12345"
输出:"1 2 3 1st St NW Hampton, IA 1 2 3 4 5"
完全满足需求,既分隔了纯数字序列的每个数字,又保留了地址中序数词的原有格式。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

