吾爱咖啡 发表于 2022-9-12 02:59

请教一个正则表达式的问题

本帖最后由 吾爱咖啡 于 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 08:50

本帖最后由 HA? 于 2022-9-12 09:13 编辑

你的正则表达式中的【<.+?><.+?>】作用是这样:
========================================================================
1.匹配一个以<开头的一个字符
2.后面跟上一个小写字母
3.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的><之前一位
4.再匹配上一次><
5.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的>之前一位
6.再匹配上一次>
========================================================================
第一次匹配效果如下
https://tntfiles.com/preview/8cd2b18ec60781a86c333db9dc012d2ca5ed2416ee730cdbe232f28ae68f00de_ani.gif
这就是你能匹配到中间两个标签的原因

zpy2 发表于 2022-9-12 05:53

<.+?><.+?>

.匹配 /
</strong>
<.+?><.+?>/
a-z小写字母没有 /

nissansz 发表于 2022-9-12 06:23

HA? 发表于 2022-9-12 09:07

那么回过头来分析一下为什么之前的【<.+?><.+?>】不达到这样的匹配效果

关键点在于第一个<后面加上了,这样就确保第一个标签后面不能是正斜杠【/】,也就排除了前面的【</strong>】这个结束标签
具体效果看楼上的动画演示,在匹配到【</strong>】的时候回溯了一下,此次回溯正是将这里排除掉了,所以符合目标的只剩下了后面中间2个标签

GTFX 发表于 2022-9-12 09:27

HA? 发表于 2022-9-12 08:50
你的正则表达式中的【】作用是这样:
================================================================ ...

请问……这个动画是什么软件?

E飞翔 发表于 2022-9-12 09:39

本帖最后由 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>

// 结果
疑是地上霜
疑是地上霜
疑是地上霜

fanvalen 发表于 2022-9-12 10:10

我建议是使用成对的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>

HA? 发表于 2022-9-12 11:17

GTFX 发表于 2022-9-12 09:27
请问……这个动画是什么软件?

regex101的调试工具

隔壁家的王二狗 发表于 2022-9-12 14:41

E飞翔 发表于 2022-9-12 09:39


//匹配中文 正则表达式


用Unicode 表示汉字吗
页: [1] 2
查看完整版本: 请教一个正则表达式的问题