请教一个正则表达式的问题
本帖最后由 吾爱咖啡 于 2022-9-13 01:21 编辑我看大部分网友都没明白我在问什么,或许是我没解释清楚,所以我再解释一下。
我在网页上截取的字符串格式如下,有3种格式:
var str1 = '9.12</strong>床前明月光<span style="color:#0066ff;"><strong>疑是地上霜</strong></span></p>';
var str2 = '9.12</strong>床前明月光<strong><span style="color:#0066ff;">疑是地上霜</strong></span></p>';
var str3 = '9.12</strong>床前明月光<span style="color:#0066ff;"><b>疑是地上霜</b></span></p>';
var v = str1.replace(/<.+?><.+?>/, "\n答案:");
//v = v.replace(/<.+?>/g, "");
console.log(v);
执行替换后结果如下:
9.12
答案:疑是地上霜</strong></span></p>
我只是想替换中间的两个尖括号<><>,用一个表达式匹配三种格式,但不知道为什么会把前面的也匹配到了。百度了两个多小时,都没找到答案。当我尝试把表达式改为/<.+?><.+?>/,意外达成了我想要的结果:
9.12</strong>床前明月光
答案:疑是地上霜</strong></span></p>
只要把上面的注释符去掉,就能达成我想要的最终结果:
9.12床前明月光
答案:疑是地上霜
我想知道为什么/<.+?><.+?>/会匹配到</strong>床前明月光<span style="color:#0066ff;"><strong>,而不是只匹配<span style="color:#0066ff;"><strong>呢?(我不知道这算什么,没有关键词,不好百度。)
--------------------------------------------------------------------------------------------------
4楼这位网友@HA? 回答的第3条好像就是答案,以后我再写表达式会注意的,谢谢! 本帖最后由 HA? 于 2022-9-12 09:13 编辑
你的正则表达式中的【<.+?><.+?>】作用是这样:
========================================================================
1.匹配一个以<开头的一个字符
2.后面跟上一个小写字母
3.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的><之前一位
4.再匹配上一次><
5.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的>之前一位
6.再匹配上一次>
========================================================================
第一次匹配效果如下
https://tntfiles.com/preview/8cd2b18ec60781a86c333db9dc012d2ca5ed2416ee730cdbe232f28ae68f00de_ani.gif
这就是你能匹配到中间两个标签的原因
<.+?><.+?>
.匹配 /
</strong>
<.+?><.+?>/
a-z小写字母没有 /
那么回过头来分析一下为什么之前的【<.+?><.+?>】不达到这样的匹配效果
关键点在于第一个<后面加上了,这样就确保第一个标签后面不能是正斜杠【/】,也就排除了前面的【</strong>】这个结束标签
具体效果看楼上的动画演示,在匹配到【</strong>】的时候回溯了一下,此次回溯正是将这里排除掉了,所以符合目标的只剩下了后面中间2个标签 HA? 发表于 2022-9-12 08:50
你的正则表达式中的【】作用是这样:
================================================================ ...
请问……这个动画是什么软件? 本帖最后由 E飞翔 于 2022-9-12 09:41 编辑
//匹配中文 正则表达式
.*?>([\u4e00-\u9fa5]+)</
// 原文
9.12</strong>床前明月光<span style="color:#0066ff;"><strong>疑是地上霜</strong></span></p>
9.12</strong>床前明月光<strong><span style="color:#0066ff;">疑是地上霜</strong></span></p>
9.12</strong>床前明月光<span style="color:#0066ff;"><b>疑是地上霜</b></span></p>
// 结果
疑是地上霜
疑是地上霜
疑是地上霜
我建议是使用成对的web标签
比如<strong>(.*?)</strong>就是一对
然后str1,2是一个错误的标签对,是不可能出现的情况,因为编译不通过。
只能是<strong><span style="color:#0066ff;">疑是地上霜</span></strong>
在<strong>(.*?)</strong>中间夹了一个或多个<span style="color:#0066ff;">(.*?)</span>
或者是<span style="color:#0066ff;">(.*?)</span>中间嵌了一个或多个<strong>(.*?)</strong>
str3就是<span style="color:#0066ff;">(.*?)</span>中嵌了一个或多个<b>(.*?)</b>标签
标签中可以加修饰也可以不加 style="color:#0066ff;"
经过上面修正得到要么是
<strong>疑是地上霜</strong>
或是
<span style="color:#0066ff;">疑是地上霜</span>
有或
<b>疑是地上霜</b>
用或模式匹配|<b>(.*?)</b>|<span style="color:#0066ff;">(.*?)</span>|<strong>(.*?)</strong> GTFX 发表于 2022-9-12 09:27
请问……这个动画是什么软件?
regex101的调试工具 E飞翔 发表于 2022-9-12 09:39
//匹配中文 正则表达式
用Unicode 表示汉字吗
页:
[1]
2