吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1017|回复: 11
收起左侧

[已解决] 请教一个正则表达式的问题

  [复制链接]
吾爱咖啡 发表于 2022-9-12 02:59
本帖最后由 吾爱咖啡 于 2022-9-13 01:21 编辑

我看大部分网友都没明白我在问什么,或许是我没解释清楚,所以我再解释一下。
在网页上截取的字符串格式如下,有3种格式:
[JavaScript] 纯文本查看 复制代码
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);

执行替换后结果如下:
[JavaScript] 纯文本查看 复制代码
9.12
答案:疑是地上霜</strong></span></p>

只是想替换中间的两个尖括号<><>,用一个表达式匹配三种格式,但不知道为什么会把前面的也匹配到了。百度了两个多小时,都没找到答案。当我尝试把表达式改为/<[a-z].+?><.+?>/,意外达成了我想要的结果
[JavaScript] 纯文本查看 复制代码
9.12</strong>床前明月光
答案:疑是地上霜</strong></span></p>

只要把上面的注释符去掉,就能达成我想要的最终结果:
[JavaScript] 纯文本查看 复制代码
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 编辑

你的正则表达式中的【<[a-z].+?><.+?>】作用是这样:
========================================================================
1.匹配一个以<开头的一个字符
2.后面跟上一个小写字母
3.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的><之前一位
4.再匹配上一次><
5.再匹配带上一个或多个非换行符的单个字符,这次匹配的字符数量是从此处开始到在离当前位置最近的>之前一位
6.再匹配上一次>
========================================================================
第一次匹配效果如下

这就是你能匹配到中间两个标签的原因

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
吾爱咖啡 + 1 + 1 谢谢@Thanks!
qqyou + 1 + 1 热心回复!

查看全部评分

zpy2 发表于 2022-9-12 05:53
<.+?><.+?>

.匹配 /
</strong>
<[a-z].+?><.+?>/
a-z小写字母没有 /
头像被屏蔽
nissansz 发表于 2022-9-12 06:23
HA? 发表于 2022-9-12 09:07
那么回过头来分析一下为什么之前的【<.+?><.+?>】不达到这样的匹配效果

关键点在于第一个<后面加上了[a-z],这样就确保第一个标签后面不能是正斜杠【/】,也就排除了前面的【</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 编辑

[JavaScript] 纯文本查看 复制代码

//  匹配中文 正则表达式
.*?>([\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的调试工具

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
GTFX + 1 + 1 谢谢@Thanks!

查看全部评分

隔壁家的王二狗 发表于 2022-9-12 14:41
E飞翔 发表于 2022-9-12 09:39
[mw_shl_code=javascript,true]

//  匹配中文 正则表达式

用Unicode 表示汉字吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表