正则表达式匹配文本中的编号、属性名及属性值需求
解决从单行文本提取编号、属性及值的正则方案
嘿,我看你之前的正则没匹配成功,问题出在你用了\n(换行符),但你的示例文本是单行的,根本没有换行,所以那些换行符匹配不到自然就失败啦!我给你整理了一套能精准匹配的正则方案,分两步来搞定:
第一步:匹配每个条目(编号+属性块)
先把每个编号和对应的{...}块提取出来,用这个正则:
(\d+\.\d{3})\s*\{\s*(.*?)\s*\}
来拆解下每个部分的作用:
(\d+\.\d{3}):捕获编号,匹配1个或多个数字开头,加小数点,再加固定3位数字的格式(比如1.001、2.001)\s*\{\s*:匹配{符号前后的任意空白(空格、制表符都能覆盖),兼容文本里的空格格式(.*?):非贪婪模式捕获{}内部的所有属性内容,避免过度匹配到后面的其他块\s*\}:匹配}符号前后的任意空白
第二步:从属性块中提取单个属性名和值
拿到第一步捕获的属性块内容后,用这个正则来拆分每个键值对:
(\w+)\s*=\s*(.*?);
拆解:
(\w+):捕获属性名称(比如position、rotation),\w能匹配字母、数字和下划线,覆盖常见的属性名格式\s*=\s*:匹配等号前后的任意空白,兼容文本里的空格(.*?):非贪婪模式捕获属性值,不管是括号包裹的坐标(0,0,0),还是布尔值False,都能精准捕获到分号前的内容
示例测试
拿你的示例文本测试:
1.001 { position = (0,0,0); rotation = (0.0, 0.0, 0.0, 1.0); } 1.002 { rotation = (0.0, 0.0, 0.0, 1.0); } 2.001 { spawnOnStart = False; }
第一步会捕获到3个条目:
- 编号:
1.001,属性块内容:position = (0,0,0); rotation = (0.0, 0.0, 0.0, 1.0); - 编号:
1.002,属性块内容:rotation = (0.0, 0.0, 0.0, 1.0); - 编号:
2.001,属性块内容:spawnOnStart = False;
然后对每个属性块用第二步的正则,就能提取出对应的属性和值啦。
小提示
如果你的文本里可能存在多行的{...}块,只需要把第一步正则里的.*?换成[\s\S]*?,这样就能匹配包含换行的块内容了,通用性更强。
内容的提问来源于stack exchange,提问作者Vifi
相关产品推荐
相关产品推荐

