求可替换非逗号后所有空白字符的正则表达式
正则表达式:替换非逗号后的空白字符为下划线
问题背景
需要将字符串中所有不在逗号之后的空白字符替换为下划线。尝试过正则表达式 (^|[^,])\s+,但该表达式会删除空白字符前的字符,导致结果不符合预期。
示例
原字符串:
{id=565189.0, server=Ealyn, merchantName=Nox, activeMerchants=[{id=f01b617d-2dc7-4597-2297-08dabad9a125, name=Nox, zone=Nebel horn, card={name=Bergstrom, rarity=2.0}, rapport={name=Energy X7 Capsule, rarity=3.0}, votes=0.0}]}
预期结果:
{id=565189.0, server=Ealyn, merchantName=Nox, activeMerchants=[{id=f01b617d-2dc7-4597-2297-08dabad9a125, name=Nox, zone=Nebel_horn, card={name=Bergstrom, rarity=2.0}, rapport={name=Energy_X7_Capsule, rarity=3.0}, votes=0.0}]}
解决方案
方案1:负向零宽后发断言(推荐)
使用正则表达式 (?<!,)\s+,将匹配到的内容替换为 _。
正则解释
(?<!,):负向零宽后发断言,确保当前位置的前一个字符不是逗号\s+:匹配一个或多个空白字符
该正则只会选中那些不在逗号之后的空白,替换时不会影响前面的字符,完全匹配需求。
方案2:修正原有正则(利用反向引用)
如果要保留原有正则的思路,可调整替换逻辑以保留捕获的前导字符:
- 正则:
(^|[^,])\s+ - 替换为:
$1_(不同语言中反向引用语法可能有差异,比如JavaScript用$1,Python用\1)
逻辑说明
原有正则捕获了空白前的字符(要么是字符串开头,要么是非逗号字符),替换时将捕获的字符放回,再加上下划线,即可避免丢失前导字符。
验证效果
两种方案都能将示例中的Nebel horn转为Nebel_horn、Energy X7 Capsule转为Energy_X7_Capsule,同时保留逗号后的空白(如, server=Ealyn中的空格),与预期结果一致。
内容的提问来源于stack exchange,提问作者Skippero
相关产品推荐
相关产品推荐

