正则分组匹配code/price/name/status时无状态行如何设置默认status为Y
正则修改方案
问题原因
原正则末尾的\[(?<status>X|Y)\]是强制匹配项,不带状态标识的行无法命中,因此匹配失败。
修改后的正则
/^(?<code>[^=]+)=(?<price>\d{1,3}\.?\d{0,3})(?<name>.*?)\s*(?:\[(?<status>[XY])\])?;?$/gm
修改点说明
- 给状态分组外层的非捕获组添加
?标记为可选匹配,没有[X]/[Y]的行也能正常命中 - 优化各分组的匹配规则,避免贪婪匹配导致内容错位:
- 用
[^=]+替代原.*匹配code,精准定位到等号前的所有内容 - 用非贪婪匹配
.*?匹配name,不会吞掉后续的状态标识 - 添加行首
^、行尾$锚定和gm匹配模式,逐行匹配有效内容,自动过滤样例中无意义的首行Harga:
- 用
配套处理逻辑
JS正则中未命中的命名分组会返回undefined,匹配后加一行逻辑设置默认值即可:
const text = `Harga: X25=2.335NAME1 25 [X]; X1=5.720NAME2 5 [Y]; X2=10.720NAME3 10 [Y]; X4=4.200NAME4 4;`; const reg = /^(?<code>[^=]+)=(?<price>\d{1,3}\.?\d{0,3})(?<name>.*?)\s*(?:\[(?<status>[XY])\])?;?$/gm; const res = []; for(const match of text.matchAll(reg)){ const item = {...match.groups}; item.status = item.status ?? 'Y'; // 无状态时默认设为Y res.push(item); } console.log(res);
运行结果
[ { code: 'X25', price: '2.335', name: 'NAME1 25', status: 'X' }, { code: 'X1', price: '5.720', name: 'NAME2 5', status: 'Y' }, { code: 'X2', price: '10.720', name: 'NAME3 10', status: 'Y' }, { code: 'X4', price: '4.200', name: 'NAME4 4', status: 'Y' } ]
内容的提问来源于stack exchange,提问作者Driller
相关产品推荐
相关产品推荐

