正则表达式高级 ——《精通正则表达式》 +Java/Go/Python官方文档 +多年经验 +实验结果 知识整理 [TOC] 第3章 正则表达式的特性和流派概览 常用的元字符和特性 102...正则反向引用(Java Python)\n(golang貌似未提供) 字符反向引用(Java golang)$n 字符反向引用(Python)\n \g 命名捕获(Java)(?...正则反向引用(Java)\k 字符反向引用(Java golang)${name} 字符反向引用(golang)$name 命名捕获(Python golang)(?...正则反向引用(Python)(?P=name) 字符反向引用(Python)\g 多选结构...|... 仅分组不捕获(?:...) 固化分组(golang不支持)(?...Java不支持: 条件(Python)(?(n/name)...|...) 代码条件(?... ...|...) 嵌入式注释(?#...) 嵌入式代码(?{...}) 动态表达式(??
一、理解反向引用 要想理解为什么需要反向引用,最好的方法是看一个例子。HTML 程序员使用标题标签 到 ,以及配对的结束标签来定义和排版 Web 页面里的标题文字。...二、反向引用匹配 先来看一个比较简单的例子,这个问题如果不使用反向引用,根本无法解决。假设你有一段文本,想把这段文本里所有连续重复出现的单词找出来。...理解反向引用的最好方法就是看看它的实际应用,下面这段文本中包含 3 组重复的单词。...所以在上面那个例子中,[ ]+(\w+)[ ]+\1 匹配连续两次重复出现的单词。可以把反向引用想象成变量。 看过反向引用的用法之后,再回到 HTML 标题的例子。...利用反向引用,可以构造一个模式去匹配任何一级标题的开始标签以及相应的结束标签,忽略任何不配对的标签。
1.1.3 开始与结束字符 本节通过一个示例介绍在 Python中如何使用正则表达式。 在1.1.1 节介绍基本元字符时介绍了^和,它们可以用于匹配一行字符串的开始和结束。...1.3 量词 之前学习的正则表达式元字符只能匹配显示一次字符或字符串,如果想匹配显示多次字符或字符串可以使用量词 1.3.1 量词的使用 量词表示字符或字符串重复的次数,正则表达式中的量词如下表:...,只是给正则表达式命名了,以后就可以通过组编号或组名字来访问 1.4.3 反向引用分组 除了可以在程序diamante中访问正则表达式匹配之后的分组内容,还可以再正则表达式内部引用之前的分组。...*'并不能保证开始标签和结束标签是一致的。为了解决此问题,可以引用反向引用,即让第二组反向引用第一组。在正则表达式中反向引用语法是\组编号,组编号是从1开始的。...捕获分组的匹配子表达式结果被暂时保存到内存中,以备表达式或其他程序引用,这个过程称为”捕获”,捕获结果可以通过组编号或组名进行引用。
Java 中regex 包使用正则表达式基本步骤 通过正则表达式创建模式对象 Pattern。 通过模式对象 Pattern,根据指定字符串创建匹配对象 Matcher。...是限定符 * 或 + 或 ? 或 {} 后面的第一个字符,那么表示非贪婪模式(尽可能少的匹配字符),而不是默认的贪婪模式 分组和反向引用 小括号 () 可以达到对正则表达式进行分组的效果。...模式分组后会在正则表达式中创建反向引用。反向引用会保存匹配模式分组的字符串片断,这使得我们可以获取并使用这个字符串片断。...在以正则表达式替换字符串的语法中,是通过 $ 来引用分组的反向引用,$0 是匹配完整模式的字符串(注意在 JavaScript 中是用 $& 表示);$1 是第一个分组的反向引用;$2 是第二个分组的反向引用...而不需要使用 [\\.]。因为正则对于 [] 中的 .,会自动处理为 [\.],即普通字符 . 进行匹配。
语法在MongoDB中,我们可以使用/$regex/操作符来进行正则表达式查询。其中,$regex表示使用正则表达式进行查询,两个/之间的内容表示正则表达式的模式。...n个、{n,m}表示匹配前一个字符的n到m个等;分组和反向引用,例如(abc)表示匹配abc字符串、\1表示反向引用第一个分组匹配的内容等。...操作符在MongoDB中,我们可以使用以下操作符进行正则表达式查询:$regex:表示使用正则表达式进行查询;$options:表示正则表达式的选项,包括i表示不区分大小写、m表示多行匹配、s表示匹配包括换行符在内的所有字符...、x表示忽略正则表达式中的空白字符等。...不区分大小写匹配如果我们想要查找名字中包含字母"a"或"e"的文档,不区分大小写,可以使用正则表达式的i选项:db.users.find({ "name": { $regex: "a|e", $options
分组及反向引用 [a]. (子表达式) ,自动命名分组(从1开始以数字自动为分组命名),后续表达式中可通过反向引用来获取该分组的内容。...例如匹配字符串“so so”的正则表达式可以是 ^(\w{2})\s(\1)$ ,其中 \1 就是反向引用。 [b]. (?...:子表达式) ,非捕获分组,该类型的分组将不纳入匹配对象的group属性中,并且无法通过反向引用在表达式的后续部分获取该分组的内容。通常是配合 | 使用。...子表达式A)子表达式B ,零宽负向后行断言(也称为反向搜索不匹配)。例如匹配字符串"abcd"中的a和b的正则表达式可以是 (?<!\w{2})\w 4....:)/或/(?=)/,则匹配任何字符串均返回匹配成功,且配结果为空字符串。而JS中 RegExp('') 所生成的是无捕获分组 /(?:)/ 。 而仅含/(?!)
反向引用 除了使用相应API来引用分组,也可以在正则本身里引用分组。但只能引用之前出现的分组,即反向引用。 还是以日期为例。...虽然匹配了要求的情况,但也匹配”2016-06/12”这样的数据。 假设我们想要求分割符前后一致怎么办?此时需要使用反向引用: var regex = /\d{4}(-|\/|\.)... 匹配一个开标签,可以使用正则]+>, 匹配一个闭标签,可以使用]+>, 但是要求匹配成对标签,那就需要使用反向引用,如: var regex = /]+)>[\...( regex.test(string3) ); // false 其中开标签]+>改成]+)>,使用括号的目的是为了后面使用反向引用,而提供分组。...闭标签使用了反向引用,。 另外[\d\D]的意思是,这个字符是数字或者不是数字,因此,也就是匹配任意字符的意思。 小结 正则中使用括号的例子那可是太多了,不一而足。
其实现方式是使用字符组,譬如 [abc],表示该字符是可以字符 "a"、"b"、"c" 中的任何一个。...里引用分组,还可以在正则里引用,即反向引用。...反向引用有三个 Tips: Tip1:如果出现类似 \10,则表示第 10 个分组而不是 \1 和 0,如果需要表示后者,需要使用非捕获括号,表示成 (?:\1)0 或 \1(?:0)。...非捕获括号 之前的例子,括号里的分组或捕获数据,以便后续引用,称之为捕获型分组和捕获型分支。如果只想使用括号原始功能,可以使用非捕获型括号 (?:p) 和 (?:p1|p2|p3)。...正则的构建 构建正则的平衡法则: 匹配预期的字符串 不匹配非预期的字符串 可读性和可维护性 效率 这里只谈如何改善匹配效率的几种方式: 使用具体型字符组来代替通配符,来消除回溯 使用非捕获分组。
1、简介 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。...\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 \W 除了字母、数字和下划线外的任一一个字符 \s 包括空格、制表符、换行符等空白字符的其中任意一个 \S 除了空格,...\w 正则表达式的匹配模式 IGNORECASE 忽略大小写模式 匹配时忽略大小写。...:Expression)非捕获组 一些表达式中,不得不使用( ),但又不需要保存( )中子表达式匹配的内容,这时可以用非捕获组来抵消使用( )带来的副作用。...2.6、反向引用(\nnn) 每一对()会分配一个编号,使用 () 的捕获根据左括号的顺序从 1 开始自动编号。 通过反向引用,可以对分组已捕获的字符串进行引用。
) limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件:...表达式可以是简单的值、对模型(或任何关联模型)上的字段的引用或者聚合表达式(平均值、总和等)。 ...关键字参数指定的Annotation将使用关键字作为Annotation 的别名。 匿名参数的别名将基于聚合函数的名称和模型的字段生成。 只有引用单个字段的聚合表达式才可以使用匿名参数。...bool__title="python").values("name") print(res9) 条件查询即与对象查询对应,是指filter,values等方法中的通过__来明确查询条件 4.3F查询和...__gt=4 九、实例 1、Django的ORM中如何判断查询结果是否为空,判断django中的orm为空 result= Booking.objects.filter() 方法一 .exists()
捕获的子序列稍后可以通过 Back 引用(反向引用) 在表达式中使用,也可以在匹配操作完成后从匹配器检索。...Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列。...注意:反向引用,引用的是前面捕获组中的文本而不是正则,也就是说反向引用处匹配的文本应和前面捕获组中的文本相同,这一点很重要。....*\1 其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,”abc” 或 ” ’ ” 或 ’ ” ’ ,但是请注意,它并不会对” a’或者 ‘a”匹配...原因是捕获组捕获的内容是被存储在内存中,可供以后使用,比如反向引用就是引用的内存中存储的捕获组中捕获的内容。而非捕获组则不会捕获文本,也不会将它匹配到的内容单独分组来放到内存中。
元字符" | " 将两个匹配条件进行逻辑“或”运算。 例如:‘z|food’ 能匹配 “z” 或 “food”或者zood(一种类型)(因为这其中包括z)。...加上\转义符之后就表示通用符了,没有了其自身的特变含义。 对于*.+类的元字符,若想使用其本身,1.\\*或@“\*” 对于\d等的来说,则需使用@“\\d”才可。...$这种类型的只能是good才可以goodgood也不可以,这为完全匹配 反向引用(正则表达式内部用组) 在正则表达式替换时,通过$1、$2、...来引用分组信息,而在正则表达式中,引用分组信息通过\...1、\2、...这种引用方式就是“反向引用”。...代码:一需要该模式的字符串,重叠,就要想到反向引用: string str = "啊啊啊洋洋洋"; string newStr= Regex.Replace(str, @"(.)\1+", "$1")
字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,"n"匹配字符"n"。"\n"匹配换行符。序列"\\\\"匹配"\\","\\("匹配"("。...(z|f)ood' 匹配"zood"或"food"。 [xyz] 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 [^xyz] 反向字符集。匹配未包含的任何字符。...允许在正则表达式中使用 ASCII 代码。 \num 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。...\n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。...\nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。
字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,"n"匹配字符"n"。"\n"匹配换行符。序列"\\\\"匹配"\\","\\("匹配"("。...(z|f)ood' 匹配"zood"或"food"。 [xyz] 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 [^xyz] 反向字符集。匹配未包含的任何字符。...允许在正则表达式中使用 ASCII 代码。 \num 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。...\n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n是八进制转义码。...\nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。
ES5在第一个参数是正则时,不允许此时使用第二个参数,会报错。 // 返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。 // 下面代码返回”i”。...返回:true或false。 RegExpObject.toString() 返回:字符串 字符 | 指示在两个或多个项之间进行选择。类似js中的或,又称分支条件。...>/gi; str.match(reg); // 返回结果 ["", "", "", ""] 反向引用:...反向引用的例子,给MikeMike字符后加个单引号: var reg = /(Mike)(\1)(s)/; var str = "MikeMikes"; console.log(str.replace(...\un 匹配 n,其中n 是以四位十六进制数表示的 Unicode 字符。 \nm 或 \n 先尝试反向引用,不可则再尝试标识为一个八进制转义码。
捕获性分组会创建反向引用, 每个反向引用都由一个编号或名称来标识, js中主要是通过 $+编号 或者 \+编号 表示法进行引用....反向引用 能在正则表达式内部使用的引用只有『反向引用』,其格式为\+数字 ,通常用于匹配不同位置相同部分的子串。...,那么相对的,反向引用的子表达式\1将依次匹配”a”、”b” 或 “c”。...因此实际上,捕获性分组[abc]和反向引用\1将同时捕获”a”、”b” 或 “c”中的同一个字符,即有三种可能捕获的结果:”aa”,”bb” 或 “cc”。...反向引用常用来匹配重复出现的字符串,而不是重复出现的子表达式,这点要尤为注意。因此如果想要匹配4个或2个数字的话,使用如下正则表达式是万万不行的。
捕获性分组会创建反向引用, 每个反向引用都由一个编号或名称来标识, js中主要是通过 $+编号 或者 \+编号 表示法进行引用. 如下便是一个捕获性分组的例子....反向引用 能在正则表达式内部使用的引用只有『反向引用』,其格式为\+数字 ,通常用于匹配不同位置相同部分的子串。...,那么相对的,反向引用的子表达式\1将依次匹配”a”、”b” 或 “c”。...因此实际上,捕获性分组[abc]和反向引用\1将同时捕获”a”、”b” 或 “c”中的同一个字符,即有三种可能捕获的结果:”aa”,”bb” 或 “cc”。...反向引用常用来匹配重复出现的字符串,而不是重复出现的子表达式,这点要尤为注意。因此如果想要匹配4个或2个数字的话,使用如下正则表达式是万万不行的。
嵌入式条件语法也使用了 ?,这并没有什么让人感到吃惊的地方,因为嵌入式条件不外乎以下两种情况:根据反向引用来进行条件处理;根据环视来进行条件处理。 1....反向引用条件 反向引用条件仅在一个前面的子表达式得以匹配的情况下才允许使用另一个表达式。...在条件里,反向引用编号(本例中的1)在条件中不需要被转义。因此,?(1)是正确的,?(\1)则不正确(但后者通常也能用)。刚才使用的模式只在给定条件得到满足时才执行表达式。...如果没有使用括号,电话区号和其余数字之间的 - 分隔符必须被匹配。第 4 行因为左括号 ( 没有与之匹配的右括号 ),所以嵌入条件被视为无关文本,完全被忽略了。 ...环视条件的语法与反向引用条件的语法大同小异,只需把反向引用(括号里的反向引用编号)替换为一个完整的环视表达式就行了。
. | \ ( ) { } [ ]) 原义字符 这个没什么好解释的,我们一直在举例的 /is/ 匹配字符串'is' \将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。...其他的在前端引用比较少,应该在后端处理文本文件的时候会用到 字符类 [] 在前面的手机号正则例子中,我们已经使用过[] /^134578{9}/ : [34578]表示34578任意一个数字即可。.../ 如果想知道,正则表达式是如何匹配量词的,请看 进阶正则表达式 文中有介绍,正则是如何回溯的。 分组与反向引用 分组,又称为子表达式。把正则表达式拆分成小表达式。...分组往往和反向引用一起使用,别被概念吓到:当一个正则表达式被分组后,每个分组自动被赋予一个组号,一左到右分别是 12… 再把之前的例子拿出来 /^(\d{4})[/-](\d{2})[/-](\d{2}...轻松的可以拿到 group#1 #2 #3 的内容,对应 12 ? 如果在反向引用中不想捕获年该如何操作? 加上 ?:即可 /^(?:\d{4})[/-](\d{2})[/-](\d{2})$/ ?
领取专属 10元无门槛券
手把手带您无忧上云