[AaronYang]那天有个小孩跟我说Js正则

按照自己的思路学习Node.Js 随心出发。突破正则冷门知识点,巧妙复习正则常用知识点

本篇博客地址:http://www.cnblogs.com/AaronYang/p/3979710.html

开发准备(AaronYang原味)(看完加20分)

1你需要有个带开发者工具的浏览器,我这里用chrome浏览器

来这里学习,第一也为巩固自己的知识,二来真的很需要它。正则入门简单,高级理解了也简单,但是因为不经常用,所以过段时间也就忘了

跟正则相似作用的操作:

打开电脑,搜索文件,比如 *.doc  是找出所有.doc结尾的文件,*号是通配符。

SQL: SELECT * FROM Persons WHERE City NOT LIKE ‘%lon%‘      这里的%是通配符,找出包含lon的City

好了,下面主要说正则。

2基础回顾,比较简洁

好了,打开谷歌浏览器,按F12,点击Console

第一个正则-----HelloWorld,学会\b

var hello="hello world";
    var reg=/hello world/;
    alert(reg.test(hello))   //输出 true

这里/ 正则 /(细节) ,使用了 正则点test方法,test表示括号内的字符串是否符合正则的匹配,符合返回true,不符合返回false

这里的reg的匹配意思是,是否包含hello world,如果想要精确地查找hello world,则需要\b。 \b在正则里表示 单词的开头或者结尾,单词的分界。这里的意思是hello world作为一个单词,中间不能包含任何字符

比如hello world1 都是不符合的,但是 hello world hello world 就符合

如果想要完整匹配,就要 ^hello world&    ^$表示一个正则表达式的整体

var reg=/\bhello world\b/;

     第二个正则-----复习正则基本格式

学会 斜杠类字符(\w \d .) 寓意 加 特殊字符( * + ? {明确数字})  加 正则外的额外说明(g i)    加 正则的额外切割整体和部分的字符(^$ 还有 ()括弧 | )

1.        \w 字母或数字或下划线或汉字,记忆技巧 网站用户名注册可以中文

\d 数字,这个太好记了,因为常用

.   换行符以外的任意字符

\s 任意空白符,记忆技巧s是space的缩写,space是键盘上的空格键,空白的

跟\d 相反匹配的 \D   ,\W,\S   \B 等 。例如\d表示匹配数字,\D就是所有非数字以外的字符

\d -> [0-9]

\D -> [^0-9]

\w -> [a-zA-Z0-9_]

\W ->[^a-zA-Z0-9]

2.        有的 字符 比如 . 号,他不带斜杠,表示正则匹配符号,如果你想匹配  .net  这个字符,你就用 \.   来替代 点号。 斜杠是转义字符,如果你匹配的字符是正则已经预定义好的,你就要用斜杠来转义了

3.        对字符的附加说明

例如 \d+   这里的+号表示 1个以上,\d表示数字,整句话的意思就是 1个以上的数字,加号等同于 {1,} 所以正则也可以这样写 \d{1,}

?  表示 0个或者1个               *号表示 0个或者很多个

接下来就是花括号类型的 说明 {1} 表示 1个

{1,}表示不少于1个

{1,10}表示   不少于1个,不超过10个

4.      /g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个

/i 表示匹配的时候不区分大小写

/m 表示多行匹配,什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号,有的字符串含有\n也就是多行

5.     其他的

[输入任意字符] 例如 11[029] 表示 匹配110,112,119的字符

[a-z0-9A-Z_]  跟 \w有点像(不考虑中文)

[^123]表示匹配除了1,2,3这3个字符以外的任意字符

.*  表示匹配 任意数量的不包含换行的字符

6. 使用子匹配

可以使用( )进行字匹配

var osVersion = "Ubuntu 8";//其中的8表示系统主版本号
re=/^[a-z]+\s+(\d+)$/i;//用()来创建子匹配
arr =re.exec(osVersion);
alert(arr[0]);//整个osVersion,也就是正则表达式的完整匹配
alert(arr[1]);//8,第一个子匹配,事实也可以这样取出主版本号
alert(arr.length);//2  

如果把字符也括起来,则又是一组

中级正则 学习(看完加30分)

1零宽断言 (匹配但是不捕获,不捕获就是不返回值)

正向零宽断言(  =  )

写了一些例子,希望你能理解

①  (?=express)          匹配express前面的位置

匹配 21或者24前面的位置,前面是ay,所以匹配ay,符合的只有way21 ay24,由于匹配是ay,不包括21和24(强调),并不是ay21或者是ay24,所以replace时候,替换的只是ay,并不是ay21或者ay24

(?=express) 属于先行断言(零宽度正预测先行断言) 先从字符串右边开始查找21或者24结尾的ay,匹配到后,开始替换,即 先替换的 ay24为test24,然后是 way21替换成wtest21。

那么和 /ay(21|24)/ig 的区别是什么?

/ay(21|24)/ig 则匹配的只有2中两种可能,匹配查找ay21 或者ay24,然后替换

split的用法,只是用ay开头21或者24结尾作为分组条件

========================================aaronyang.cnblogs.com========================================

② (了解一下,js中的正则不支持) (?<=express)      匹配express后面的位置(Javascript不支持后向查找)

(?<=express)属于后发断言(零宽度正回顾后发断言),先从字符串左边开始查找,例如

(?<=abc).* 可以匹配 abcdefgabc 中的 defgabc 而不是 abcdefg

下面有个经典的例子,说明这两个的用法

(?<=\s)\d+(?=\s) 匹配以空白符间隔的数字(再次强调,不包括这些空白符)

负向零宽断言(  !  )   看到感叹号,就知道是  "非",相反的意思

(?!express) 匹配后面跟的不是express的位置

例如:

(?!express) 属于先行断言,从右往左找 ay,第一个是ay24 发现ay后面不能跟24,所以不符合,继续找,找到ay23,符合条件,split出第一个值23 ay24 aaronyang21 2121

继续找,找到 aya22 符合条件,split出 a22,继续找,找到ay221,split出221,最后一个way21不符合,单独一份,最终split结果就是

"way21 ", "221 ", "a22 ", "23 ay24 aaronyang21 2121"

故事:bb这个字符串可以理解为一个长木头,第一次在ay23处,把ay两个字母凿了出去,切一段,以此类推,凿了4段,然后打包返回

========================================aaronyang.cnblogs.com========================================

当然这里的replace也是,竟然看会了split的,那我把故事稍微改下:

故事:bb这个字符串可以理解为一个长木头,第一次在ay23处,把ay两个字母凿了出去,留个洞,以此类推,凿了4个洞,然后在洞里填上test 4个字母,最后打包返回)

当然对应的也有 Javascript中不支持的 零宽度负回顾后发断言 (?<!express)  匹配前面不是express的位置

 (?:express)

例如:

a(?:y|aronyang) 就是一个比 ‘a|aronyang‘ 更简略的表达式

2贪婪和惰性,贪婪长,懒惰多

当正则表达式中含有 重复类别的限定符时候,后面加个? 号,表示开启懒惰模式

*? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复。

例子:

比如  ay2013ay2014ay2012ay2014

第一个是贪婪模式,从左往右,以20开始,找4结尾,取最长的一个字符串

第二个是懒惰模式,从左往右,以20开始,找最近的4,组成一个值,然后继续找,组成其他值,最后数组返回

看replace方法,都是先match值,然后替换的

3注释(知道就好)

.NET 正则可以有注释。

Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);        主要在RegexOptions中    RegexOptions.IgnorePatternWhitespace,忽略表达式中的非转义空白并启用由#标记的注释

例如:

高级正则 学习(看完加30分)

1递归组,平衡匹配,这个有点拗口,主要是分组吧

平衡组

说的是一类案例,比如 html

<div><p>testay</p></div>

p可以是一组,div是一组,看每个标签是否都有个闭合标签,这里检查一下,下面这个例子可以匹配嵌套的标签

<div[^>]*>[^<>]*(((?‘Open‘<div[^>]*>)[^<>]*)+((?‘-Open‘</div>)[^<>]*)+)*(?(Open)(?!))</div>

例2,打印出html中  超链接 a中的 href的值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace RegMy
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex reg = new Regex("(?<=<a\\s*.*href=\")[^\"]*(?=\")", RegexOptions.IgnoreCase);

            string text = "<a href=\"http://www.baidu.com/p/yangyanghaoran?from=zhidao\" class=\"user-name\" target=\"_blank\" id=\"user-name\">yangyanghaoran<i class=\"i-arrow-down\"></i></a><a href=\"333.html\"></a>";
            Match m = reg.Match(text);
            while (m.Success)
            {

                //显示匹配开始处的索引值和匹配到的值
                Console.WriteLine("Match=[" + m + "]");
                CaptureCollection cc = m.Captures;
                foreach (Capture c in cc)
                {
                    Console.WriteLine("\tCapture=[" + c + "]");
                }
                for (int i = 0; i < m.Groups.Count; i++)
                {
                    Group group = m.Groups[i];
                    System.Console.WriteLine("\t\tGroups[{0}]=[{1}]", i, group);
                    for (int j = 0; j < group.Captures.Count; j++)
                    {
                        Capture capture = group.Captures[j];
                        Console.WriteLine("\t\t\tCaptures[{0}]=[{1}]", j, capture);
                    }
                }
                //进行下一次匹配.
                m = m.NextMatch();
            }

            Console.ReadLine();
        }
    }
}

效果图:

这一块跟js的正则有点偏了,这里感兴趣的自己百度学习吧

=====================================================================================

备注:

正则表达式对象的方法

test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。如果存在则返回 true,否则就返回 false。
exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。
compile,把正则表达式编译为内部格式,从而执行得更快。

match,找到一个或多个正则表达式的匹配。
replace,替换与正则表达式匹配的子串。
search,检索与正则表达式相匹配的值。
split,把字符串分割为字符串数组。

正则表达式对象的属性

source,返回正则表达式模式的文本的复本。只读。
lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置。
$1...$9,返回九个在模式匹配期间找到的、最近保存的部分。只读。
input ($_),返回执行规范表述查找的字符串。只读。
lastMatch ($&),返回任何正则表达式搜索过程中的最后匹配的字符。只读。
lastParen ($+),如果有的话,返回任何正则表达式查找过程中最后括的子匹配。只读。
leftContext ($`),返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符。只读。
rightContext ($‘),返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符。只读。

时间: 2024-10-07 20:08:09

[AaronYang]那天有个小孩跟我说Js正则的相关文章

[AaronYang]那天有个小孩跟我说Js-EJS

按照自己的思路学习Node.Js 随心出发.EJS是Node.js中express框架中使用的一个模版引擎,当然还有Jade 我的学习就靠网上查资料,没有买书系统学,自己整理,如果有用了哪位大神的代码,还请原谅,表森气.奴婢知错了 本篇博客地址:http://www.cnblogs.com/AaronYang/p/4060189.html 开发准备(AaronYang原味) 1你需要一个Node.js开发工具 使用过SublimeText3和vs2013,还有eclipse搭建的方式,最终还是喜

OSChina 周四乱弹 —— 节日快乐

在这个特殊的日子里,各位单身程序员们有没有做好被虐的准备呢?其实小小编也不想再弄虐狗的乱弹了,可乱弹里朋友圈里微博上全是虐狗的段子.所以各位,请你们做好准备,下面的乱弹将会对单身狗们进行惨无人道的打击. @你有我有你:今晚轮到女友做饭了.女友端来一个托盘说:想吃啥请翻牌子.看到托盘上有四个牌子上面写到:香菇炖鸡,葱烧排骨,番茄牛腩,红烧牛肉.我说都要可以吗?女友说:可以就怕你吃不了.我说吃不了你就不给我零花钱了!不一会女友端上来四碗康师傅方便面. 要是有对象,就算是没有调料包的方便面小小编也吃!

如何优雅的免费叫优步专车

如何优雅的免费叫优步专车? 经常需要用车?要接送送女友,接送老婆小孩?要接送老人? 小编教你如何优雅的免费叫优步专车! 最新Uber优惠码,千万不要相信网上所说的50,100的优惠,那是骗人的,有优惠券在手才是真的! 你只要第一次使用优步,在优惠那个地方输入优惠码4hq8u,就获得一次优惠! 最新一段时间,笔者收到的优惠券都是50的了,可见,并不是哪个优惠码的差别,是优步的统一活动,任何优惠码都一样! 优惠券码4hq8u,拿去不谢! 以下是啰啰嗦嗦的优步乘车正文. 最近,笔者不经意用uber攒了

珍爱生命,举手之劳__如何优雅的叫优步专车

珍爱生命,举手之劳 经常需要用车?要接送送女友,接送老婆小孩?要接送老人? 小编教你如何优雅的免费叫优步专车! 最新Uber优惠码,千万不要相信网上所说的50,100的优惠,那是骗人的,有优惠券在手才是真的! 你只要第一次使用优步,在优惠那个地方输入优惠码4hq8u,就获得一次优惠! 最新一段时间,笔者收到的优惠券都是50的了,可见,并不是哪个优惠码的差别,是优步的统一活动,任何优惠码都一样! 优惠码4hq8u,拿去不谢! 以下是啰啰嗦嗦的优步乘车正文. 最近,笔者不经意用uber攒了些优惠券.

个人css编写规范

前言:最近在做微信小程序,因为公司小,就我一个人弄前端的东西,js和页面都是我来弄,结果那天后台的人看到我的js代码,说我的代码写得不规范,函数什么的都很乱,弄得我羞愧难当,幸亏没看我的css,其实我的css命名也很随意==!一直觉得自己css其实还是可以的,但是突然发现自己到现在的css还没有很规范,很多名称什么的还很随意,有的地方用驼峰命名,有的又用横杠,有的还会用下划线,真的太随意了,所以就上网搜了搜命名规范,改了两天终于把样式全改过来了.因此做个小结: 意义:感觉规范css代码是非常有意

[Aaronyang]谈谈2015年AY对WPF全面技术总结,AYUI来了

         原著:AY WPF博客- 把wpf推广出去,让那些鄙视的人说不 大家好! 我是AY,首先声明,我在做一件很枯燥的事情,我是个91后程序员,每天熬夜完成计划的过着下班后的生活. 那天有人反对,那天有人安慰,那天有人嘲讽,那天有人祝福. 过了6个月后,我对自己的梦想一直没有改变过,继续坚持,终于,AYUI诞生了. 今天有人说造轮子,今天有人说你好厉害,今天有人说开源吗? 有人说好喜欢... 有贬有褒,但是好的声音多了. 但是身体的各种问题也来了.. AY提供的WPF书籍下载: 下载

非洲小孩(南阳oj1036)(贪心)

非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 家住非洲的小孩,都很黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不经常洗澡.(常年缺水,怎么洗澡.) 现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木有!!(这也是没有的办法,缺水啊!!) 每个小孩有一个时间段能够洗澡.并且,他们是可以一起洗的(不管你是男孩是女孩). 那么,什么时间洗澡,谁应该来洗,由谁决定的呢?那必然是他们伟大的"澡"神啊."

LeetCode之小孩分糖果

给定一群站好队的小孩并且按某项分值排名(姑且假设为年龄吧),年龄大的要比他身边年龄小的拿的糖要多,求怎么分配糖果使得分配的糖果数最少. 用一个数组从左到右再从右到左的遍历,向前遍历时若右边的比左边的大则其值为前一个糖果数+1,向后遍历时则判断如果比后面的小孩的年龄要大且糖果数比其还少则更改其糖果数为后面小孩分的糖果数+1. 具体描述代码: #include<iostream> #include<vector> using namespace std; int candy(vecto

您会让自己的小孩将来从事软件研发吗?

您会让自己的小孩将来从事软件研发吗? 非常多程序猿,都已经30多岁了.过了而立之年,有了自己的老婆,自己温馨的小家庭,自己可爱的小孩.小孩也都是00后的. "您会让自己的孩子从事软件研发吗?" 本来小孩的事情,小孩自己做主. 但同学.朋友.同事等,见面或者聚会,都会谈起这个问题.也算一个话题吧! 可是,家长的人生观.价值观.財富观,还是会或多或少的影响到自己家孩子滴. 偶的观点是: 1.幼儿园,能够通过IPAD.或者电脑.玩玩游戏,开拓智力. 2.上小学.能够学习绘图啥滴,学习一下简单