我需要转换遵循结构的字符串:
< 3 digits
>< n digits
> [letter
[m digits
[Roman number
]]] [k letters
] < / p>
像某些人一样
&LT; 3 digits
&GT;。&LT; n digits
&GT; [(letter)
[(m digits)
[(Roman number)
]]] [- k letters
]
这些字符串例如是:
121100
&#34; - 最后没什么有趣的121100N
&#34; - 应转换为&#34; 121.100(N)
&#34; 121100N20
&#34; - 应转换为&#34; 121.100(N)(20)
&#34; 121100N20VII
&#34; - 应转换为&#34; 121.100(N)(20)(VII)
&#34; 121100NTAIL
&#34; - 应转换为&#34; 121.100(N)-TAIL
&#34; 我做了一个正则表达式
^(\d{3})(\d*)(\D)(\d*)((XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$)?(.*$)?
因此,群组为$1
- 第一个3位数字块,$2
- 其他数字,$3
- 字母,$4
- 字母后面的数字(如果有), $5
- 罗马数字(如果有的话),$8
- 字符串的其余部分(如果有的话)
现在我只需要使用非空组。无论是否找到任何内容,我当前的替换都会放置括号和短划线符号:
$1.$2($3)($4)($5)-$8
所以&#34; 121100N
&#34; - 成为&#34; 121.100(N)()()-
&#34;而不是通缉&#34; 121.100(N)
&#34;。如果找到该组,我怎样才能加上括号?
答案 0 :(得分:1)
您可能只需要执行第二个表达式来搜索空捕获组并删除括号和短划线。
查找
\(\)|-$
替换:
replace with nothing
答案 1 :(得分:1)
您可以将匹配项传递给函数,并通过检查该捕获组是否存在匹配项来转换您的字符串。如果没有匹配,则输出一个空字符串。
let reg = /(\d{3})(\d*)([A-Z])(\d+)?((?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))?([A-Z]+)?/;
let strings = ["121100", "121100N", "121100N20", "121100N20VII", "121100NTAIL"];
strings = strings.map(str => {
let match = str.match(reg);
return (match) ? transform(match.splice(1)) : str;
});
console.log(strings);
function transform(m) {
let p0 = m[0];
let p1 = m[1];
let p2 = (m[2]) ? `(${m[2]})` : '';
let p3 = (m[3]) ? `(${m[3]})` : '';
let p4 = (m[4]) ? `(${m[4]})` : '';
let p5 = (m[5]) ? `-${m[5]}` : '';
return `${p0}.${p1}${p2}${p3}${p4}${p5}`;
}