参考资料

网-鬼斧神工之正则表达式
正则表达式后向引用详解
正则表达式30分钟入门教程

什么是正则表达式?

正则表达式是字符串的搜索和匹配的工具。

正则表达式工具

一个测试正则表达式的工具 regexpal -- 中文版

基本语法

界定符 //

表示一个正则表达式的开始和结束

/0-9/ 界定符就是包含正则表达式在中间的两个斜杠

原子

可见原子

  • 标点

  • 英文字母数字

  • 汉字、日文、阿拉伯文等语言文字

  • 数理化公式符号

  • 其他可见字符

不可见原子

  • 换行符 \n

  • 回车 \r

  • 制表符 \t

  • 空格

  • 其他不可见的符号

字符转义

如果想查找元字符本身的话,就要使用 \ 来取消这些字符的特殊意义
例如:\. \* \\

元字符

定义原子的筛选方式

代码 / 语法 说明
匹配两个或多个分支选择
[] 匹配方括号中的任意一个原子
[^] 匹配除了方括号中的原子之外的任意字符

原子的集合

代码 / 语法 说明
. 匹配除换行符以外的任何字符 [^\n]
\d 匹配数字 [0-9]
\D 匹配非数字 [^0-9]
\s 匹配一个不可见原子 [\f\n\r\t\v]
\S 匹配一个可见原子 [^f\n\r\t\v]
\w 匹配字母或数字或下划线 [0-9a-zA-Z_]
\W 匹配非字母或数字或下划线 [^0-9a-zA-Z_]
// 匹配一个或者更多连续的数字
var pattern = /\d+/;
/*
* 比如一个网站要求你填写的 QQ 号必须是 5-12 位的数字时,可以使用 ^\d{5,12}$
* {5,12} 表示重复次数不少于 5 次,不能多于 12 次,否则都不匹配
* 有些正则表达式处理工具还有一个处理多行的选项,如果选中了这个选项
* ^ 和 $ 的意义就变成了匹配行的开始处和结束处
*/

量词

限定符 -- 指定数量的代码

代码 / 语法 说明
* 重复 0 次或更多次
+ 重复一次或更多次
重复 0 次或 1 次
{n} 恰好重复 n 次
{n,} 最少重复 n 次
{n,m} 重复 n 次到 m 次
// 匹配刚好 6 个字符的单词
var pattern = /\bw{6}\b/;

边界控制

代码 / 语法 说明
^ 匹配字符串开始的位置
$ 匹配字符串结尾的位置
\b 匹配单词的开始或结束
\B 匹配非单词的开始或结束

使用示例

// 匹配以字母 a 开头的单词
var pattern = /\ba\w*\b/;

/*
* 先是某个单词的开头处 \b
* 然后是字母 a
* 然后是任意数量的字母或数字 \w*
* 最后是单词的结束处 \b
*/

分组

代码 / 语法 说明
() 匹配其中的整体作为原子

重复单个字符,直接在字符后面加上限定符就行了;
如果想要重复多个字符,可以用小括号来指定 子表达式(也叫 分组),然后可以指定这个 分组的重复次数,也可以对这个 分组进行其他的一些操作。

// 这个表达式可以匹配几种格式的电话号码,像 `(010)88886666`,或 `022-22334455`,或 `02912345678` 等
var pattern = /\(?0\d{2}[) -]?\d{8}/;
  1. 首先是一个转义字符 \(,他能出现 1 次或 0 次(?

  2. 然后是一个 0,后面跟着两个数字 \d{2}

  3. 然后是 )空格- 中的一个,它出现 1 次或不出现 [) -]?

  4. 最后是 8 个数字 \d{8}

修正模式

修正模式可以理解成是给正则表达式的匹配过程指定一种模式。

贪婪模式 & 懒惰模式

匹配结果怎么会有歧义呢?看看下面的代码就知道了:

var pattern = /mertens.+1994/; 
var str = 'mertens__199419941994199419941994';

上面那段代码就是有歧义的了,看上去可以是匹配到 mertens__199419941994199419941994,也可能匹配到 mertens__1994

贪婪:匹配结果存在歧义的时候取其长
懒惰:匹配结果存在歧义的时候取其短

未经修饰的量词就是贪心量词,末尾加上?则使量词变懒惰。

// 贪婪模式
var pattern1 = /mertens.+1994/; 
var str = 'mertens__199419941994199419941994';
var result1 = str.match(pattern1);
console.log(result1); // mertens__199419941994199419941994

// 懒惰模式
var pattern2 = /mertens.+?1994/; 
var str = 'mertens__199419941994199419941994';
var result2 = str.match(pattern2);
console.log(result2); // mertens__1994

后向引用

分组捕获的内容可以在表达式或其他程序中作进一步的处理。

组号

默认情况下,每个分组会自动拥有一个组号

分配组号的规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为 1,第二个为 2,以此类推。

后向引用用于重复搜索前面某个分组匹配的文本。

// \1 表示分组 1 匹配的某个文本
// 匹配连着的两个重复的单词
var pattern = /\b(w+)\b\s+\1\b/;

组名

可以 指定子表达式的组名

// 可以指定组名为 Word
// 使用这样的语法:(?<Word>\w+)
// 把尖括号换成'也行:(?'Word'\w+))
// 这样就把\w+的组名指定为 Word 了
// 要反向引用这个分组捕获的内容,可以使用 \k<Word>
var pattern = /(?<Word>\w+) (?'Wrod'\w+)/;

// 上一个例子也可以写成这样
var pattern = /\b(?<Word>\w+)\b\s+\k<Word>\b/;

零宽断言(zero-length assertions)

使用小括号的时候,还有很多特定用途的语法:

零宽的意思是指该位置是不占宽度的,也就是只作断言判断,但不匹配实际的内容;
\d(?=\.) 这个正向先行断言就只匹配点号之前的数字,但是它并不会匹配到这个点号,这个 \d(?=\.) 括号中的匹配内容也就是零宽了。

零宽断言分为四种,分别是:
正向先行(Positive Lookahead)
正向回顾(Positive Lookbehind)
负向先行(Negative Lookahead)
负向回顾(Negative Lookbehind)

  • 正向负向 的意思是断言括号中的内容是匹配还是不匹配

  • 先行回顾 的意思是实际匹配的内容在断言内容的前面还是后面

正向先行(Positive Lookahead)

  • 直接地说“零宽正向先行断言”所匹配的就是 必须出现的断言内容的前面的内容

正向回顾(Positive Lookbehind)

  • 理解了前面这个“零宽正向先行断言”,随之而来的就比较好理解了。依照这个逻辑,零宽正向回顾断言所匹配的是必须出现的断言内容之后的内容,它的语法是:(?<=...) 比如 (?<=\.)\w 所匹配的就是点号之后的 ASCII 字符。

负向先行(Negative Lookahead)

  • 负向与正向意思相反, 正向是断言内容必须出现,而负向则是断言内容必须不出现。

负向回顾(Negative Lookbehind)

  • 正负向与先行回顾的概念都已在前面列出, 负向回顾的理解应该就很顺了。负向回顾的语法是:(?<!...)。 比如 (?<!Java)Script 该正则只匹配不是 JavaScript 的 Script,它就能正确匹配 ECMAScript 和 Script。

正则表达式基础笔记的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  4. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  5. ios – 如何识别显示为空括号的空NSData对象?

    我正在处理GameKit的GKTurnBasedMatch类中的损坏问题(参见thisthread),这有时会导致游戏状态无效,matchData损坏.因此,作为一种解决方法,我正在创建一种方法来识别这些无效匹配,以便我可以适当地处理它们.损坏的matchData似乎是一种很好的方法.但是,到目前为止,我一直无法识别它们.当我这样做:我得到以下内容:所以匹配数据显示为一对空括号“”,我希望可以

  6. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  7. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  8. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  9. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  10. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部