• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 用正则匹配class时引出的一个疑惑?

用正则匹配class时引出的一个疑惑?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了金蝶怎么引出序时账,金蝶如何引出序时账,怎样引出现在完成时,金蝶k3怎么引出序时账,class等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:用正则匹配class时引出的一个疑惑?
描述:

在用正则匹配一个特定的className时,发现了一个问题,在此请教一下大家:

比如,一个元素的完整的className是

var f = "ac   p1     p4     p0 fe   p6     p8   p9 p10 p11 ap7 p3d p12";

我想写一个正则能匹配出全部 只能由

"p"+数字

组合的class。

我自己写的一个正则如下:

var reg = /(?:\s+|^)p\d+(?:\s+|$)/g;

结果是:

["     p1     ", "     p0 ", "   p6     ", "  p9 ", " p11 ", " p12"]

发现其中少匹配了

p4 p8 p10

这里颇为费解,后来我发现规律是相邻的多个“p数字”只会间隔着匹配到!
我分析是因为:前面一个满足条件的匹配项,比如p1,它占据匹配到的前后空格,导致本来符合正则的紧邻的匹配项p4 因为p1匹配项以及占据了后空格(即是后面的匹配项p4的前空格),导致p4自己不符合正则表达式的匹配了而导致匹配不到的。

然后我修改正则为

var reg = /(?:\s+?|^)p\d+(?:\s+?|$)/g;

增加了一个最小匹配"?"

这是原字符串:

var f = "ac     p1     p4     p0 fe   p6     p8   p9 p10 p11 ap7 p3d p12";

现在的正则结果变为,

["     p1 ", "    p4 ", "    p0 ", "   p6 ", "    p8  ", " p9 ", " p11 ", " p12"]

结果匹配的比之前多了,但是还是没有全部匹配到,其中少了

p10

分析发现第2个正则,对于匹配2个挨着的 “p数字”之间只有1个空格的情况,会出现上述 丢失 的问题。
间隔有1个空格以上可以全部匹配到。

那么问题来了,
正确的正则匹配上述要求应该如何写?
对于第一种正则,它失配的原因到底怎么理解呢?我一直以为第一个正则是能匹配得到的
望大神指点一二!!在此感激不尽!


解决方案1:

没那么复杂吧,直接用\b区分单词边界就成了,最终写成:

var f = "ac   p1     p4     p0 fe   p6     p8   p9 p10 p11 ap7 p3d p12";
var res = f.match(/\bp\d+\b/g);
console.log(res); // ["p1", "p4", "p0", "p6", "p8", "p9", "p10", "p11", "p12"]

楼上几个能\d加了个中括号不知干啥用,我没看出啥作用,\bp\d+\b已经能达到楼中的要求噢。

解决方案2:

正则写不好,于是就想其他办法,比如先替换所有连续空格为单个空格,然后以空格分解字符串为数组,然后遍历判断。
或者上面说的第一步省掉 :)

解决方案3:

我觉得前后用环视匹配位置的话,可能就和LZ想的差不多了

(?:\s|^)(?=p)p\d+(?=\s|$)

解决方案4:

因为第一个表达式中:空格被p1匹配走了,p4匹配不到

解决方案5:

用\b匹配单词边界, f.match(/\bp[\d]+\b/g)

解决方案6:

直接写这样不行么?

var test = 'ac     p1     p4     p0 fe   p6     p8   p9 p10 p11 ap7 p3d p12';

var res = test.match(/p[\d]+/g);
console.log(res);//[ 'p1', 'p4', 'p0', 'p6', 'p8', 'p9', 'p10', 'p11', 'p7', 'p3', 'p12' ]

解决方案7:

想复杂了吧?直接用 \bp\d+\b 就可以了。

补充:
第一个正则失败是因为 p1 后面的空格被 p1 匹配了,到了匹配 p4 时,导致 p4 前面没有空格而匹配失败(因为 (?:\s+|^) 用了 +),其他的类似。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 用正则匹配class时引出的一个疑惑?

相关文章

  • 2017-06-07 用python写spark程序,能否做成在浏览器页面中敲代码然后执行看结果?
  • 2017-06-07 使用七牛https协议的自定义域名加载资源,浏览器提示存在不安全内容
  • 2017-06-07 Python判断编码的问题
  • 2017-06-07 python中Slash符号的作用,参数传递?
  • 2017-06-07 (python)Django利用dwebsocket实现后台数据更新实时更新到前端?
  • 2017-06-07 牛牛热线视频免费视频七牛的视频处理问题
  • 2017-06-07 python爬虫利用Python自动化部署问题
  • 2017-06-07 VFP能不能上传文件到百度网盘?
  • 2017-06-07 不同平台下使用grunt的imagemin插件压缩出的图片大小不一样
  • 2017-06-07 python如何将由多个用户信息组成的段落按不同的用户拆分开来?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • (flask)用Python的框架开发多租户系统的数据隔离方案
    • Pycharm中不同python版本同时存在的情况下使用pip错误
    • python3sql语句executemany问题
    • 使用Ueditor中的swfupload空间上传图片到七牛云的一些问题?
    • 请教一个LUA修改表值的问题~先行谢过
    • (shell)useradd-s/sbin/nologin-M-gmysqlmysql是什么意思
    • Redis保存Javascriptobject,为什么连同prototype上定义的方法也一并保存了?
    • WordPress的七牛插件都不能用了,官方不开发一个吗?
    • 在后端存储,比如多媒体文件(音频,视频,图像)是如何存储的?
    • RCL,JC问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有