2022年9月15日

正则表达式: (?= (?: (?! 的理解 Lookahead / Lookbehind Assertion

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念: // 前瞻: exp1(?=exp2) 查找exp2前面的exp1 // 后顾: (?<=exp2)exp1 查找exp2后面的exp1 // 负前瞻: exp1(?!exp2) 查找后面不是exp2的exp1 // 负后顾: (?<!exp2)exp1 查找前面不是exp2的exp1 举例: "中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr "法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到 要理解?:则需要理解捕获分组和非捕获分组的概念: ()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组…
2022年7月16日

正则表达式: 正则表达式需要转义的特殊字符

概述 正则表达式有以下特殊字符需要转义: 特别字符 说明 $ 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配‘\n'或‘\r'。要匹配$字符本身,请使用\$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(和\)。 * 匹配前面的子表达式零次或多次。要匹配*字符,请使用\*。 + 匹配前面的子表达式一次或多次。要匹配+字符,请使用\+。 . 匹配除换行符\n之外的任何单字符。要匹配.,请使用\。 [ ] 标记一个中括号表达式的开始。要匹配[,请使用\[。 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配?字符,请使用\?。 \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,‘n'匹配字符‘n'。'\n'匹配换行符。序…
2022年3月5日

正则表达式: 正则表达式中(?:pattern), (?=pattern), (?!pattern), (?<=pattern)和(?<!pattern) Lookahead / Lookbehind Assertion

(?:pattern) ()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推 (?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来 import re a = "123abc456ww" pattern = "([0-9]*)([a-z]*)([0-9]*)" print(re.search(pattern,a).group(0,1,2,3)) pattern = "(?:[0-9]*)([a-z]*)([0-9]*)" print(re.search(pattern,a).group(0,1,2)) 可以看到 (?:[0-9]*) 匹配的第一个 [0-9]*  没有保存下来,即没有保存匹配到的“123”,而([0-9]*)则保存了下来。 p…
2022年3月5日

正则表达式: 不包含特定字符串 Lookahead / Lookbehind Assertion

概述 做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式。例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符串打头的条目,等等。 使用否定式前瞻 正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那…
2022年3月5日

正则表达式: 匹配任意字符(包括换行符)

正则表达式中,“.”(点符号)匹配的是除了换行符“\n”以外的所有字符,但有时候我们需要匹配包括换行符在内的字符。 手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式,但是发现[.\n]*不可以。 经查,发现了几种正则表达式匹配任意字符(包括换行符)的方法: [\s\S]* [\d\D]* [\w\W]* 另外,[.\s]*不可以,(.|\s)*可以。…
2022年3月1日

正则表达式: Regular Expression Language - Quick Reference

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference A regular expression is a pattern that the regular expression engine attempts to match in input text. A pattern consists of one or more character literals, operators, or constructs. For a brief introduction, see .NET Regular Expressions. Each section in this quick reference lists a particular category o…
2022年1月31日

正则表达式: 正则表达式手册 / 常用正则表达式

正则表达式手册 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。?表示非贪婪模式,即为匹配最近字符。…