正则表达式需求:匹配属性内转义字符并替换<为<
要只针对name和author属性值里的<字符进行转义(替换为<),可以用精准匹配目标属性+局部替换的方案,避免误匹配其他属性。
核心思路
- 先匹配所有
name="..."、name='...'、author="..."、author='...'格式的属性 - 对每个匹配到的属性值部分,单独替换其中的
<为< - 将替换后的属性拼回原字符串
正则表达式与实现代码
以JavaScript为例,代码如下:
// 原始待处理字符串 const rawStr = `<info type="map" name="Double quotes test name < test" author="Escape < character"></info> <info type="map" name='Test name with single quotes < test' author='Escape < character'></info>`; // 处理逻辑 const processedStr = rawStr.replace( /(name|author)\s*=\s*(["'])(.*?)\2/g, (fullMatch, propName, quote, propValue) => { // 仅替换属性值里的<字符 const escapedValue = propValue.replace(/</g, '<'); // 拼接回完整属性格式 return `${propName}=${quote}${escapedValue}${quote}`; } ); console.log(processedStr);
正则各部分说明
(name|author):精准匹配目标属性名,确保只处理name/author\s*=\s*:匹配属性名后的等号,兼容等号前后的空格(["']):捕获属性值的包裹引号(单/双引号都支持),用分组2记录(.*?):非贪婪匹配属性值内容,避免跨属性匹配(比如不会从第一个引号一直匹配到最后一个引号)\2:匹配与分组2相同的引号,确保属性值闭合
为什么你的原有正则不对
你之前的正则/(?!author|name\s*=\s*)(?:\'[^']*\')/g逻辑方向错误:它是排除name/author属性,反而匹配其他单引号包裹的属性值,完全和需求相反,自然会误匹配非目标属性。
内容的提问来源于stack exchange,提问作者Oversitoo
相关产品推荐
相关产品推荐

