求助:编写可匹配多模式子串的正则表达式
搞定这个正则的办法
正确的正则表达式
/<sym>.*?<\/sym>|<sps>.*?<\/sps>|<sbs>.*?<\/sbs>|(?:(?!<sym>|<sps>|<sbs>).)+/gs
正则逻辑拆解
<sym>.*?<\/sym>:精准匹配<sym>标签对,.*?是非贪婪匹配,只会抓到最近的</sym>,不会跨标签乱匹配<sps>.*?<\/sps>:和上面逻辑一致,匹配<sps>标签对<sbs>.*?<\/sbs>:同理匹配<sbs>标签对(?:(?!<sym>|<sps>|<sbs>).)+:专门捕获三个标签之外的所有内容,(?!...)是负向前瞻,确保当前位置后不是这三个标签的开头,避免误抓标签内容;(?:...)是不捕获分组,+表示至少匹配一个字符(若需允许空串,把+改成*即可)- 修饰符
g:全局匹配,一次性返回所有符合条件的子串;s:让.能匹配换行符(文本无换行可省略)
原正则的问题所在
[^.]*:该写法限制标签内容不能包含.,完全违背你“任意值可含空格、特殊字符”的需求,必须替换为.*?非贪婪匹配(?([a-zA-Z0-9]+)):这是语法错误的无效结构,属于多余内容,直接删除即可- 缺少全局修饰符
g:不加g时,正则仅返回第一个匹配项,必然出现匹配不全的情况
测试示例
假设输入文本:abc<sym>test@123</sym>def<sps>hello world!</sps>xyz
匹配后会得到以下结果:
abc<sym>test@123</sym>def<sps>hello world!</sps>xyz
内容的提问来源于stack exchange,提问作者Dhruba
相关产品推荐
相关产品推荐

