「魔法のマッチング正規表現洗練の旅(ワンレイ)」読書ノート

 

// 不确定有限动机(Non-deterministic finite automaton,简称NFA)和确定有限动机(Deterministic finite automaton,简称DFA)。其实,正则表达式是一个不额确定有限冬季。NFA和DFA的最大区别在于它们的状态转换函数。NFA可以对同一个字符串产生多重理解方式,而DFA则只有唯一的一种理解方式。也正因为如此,NFA在匹配过程中可能会产生回溯,NFA的效率一般要低于DFA。因此,在书写正则表达式时应尽量减少回溯来提高正则表达式的效率。
// 以下正则表达式匹配一个空行,该行中不包含任何字符串
/^&/
// /^/正则表达式匹配任意行。该表达式只匹配行中的开始位置,因为任意行都包括其开始位置,所以该表达式将匹配任意行。
// 元字符\b和^、$具有相似性,它也是匹配一个位置。\b可以匹配单词的开始或结尾,即单词的分界处。通常情况下,英文单词之间往往由空格符号、标点符号或换行符号来分隔,但是元字符\b不匹配空格符号、标点符号和换行符号的任何一个,它仅仅匹配一个位置。
// \S和\w都能够匹配单词字符,但是,\S能够匹配除了单词字符之外的字符,如字符"/"和"*"等
// 当且仅当在字符类中的连接符"-"不是第一个字符时,它才具有特殊的含义。如果要在字符类中包括连接符"-",则必须将它作为第一个字符。如正则表达式[-a]匹配字符"-"或"a"
// 在字符类中使用元字符时,不需要使用转义运算
/[-.]/.test(".");	// true
/[-.]/.test("12");	// false
// [0-9a-zA-Z_]等同于\w
// [^0-9a-zA-Z_]等同于\W
// *等同于{0,}
// +等同于{1,}
// ?等同于{0,1}
// *?等同于尽可能少的使用重复的第一个匹配
// +?尽可能少的使用重复但至少使用一次
// ??使用零次重复(如有可能)或一次重复
// \S和\w都能够匹配单词字符,但是,\S能够匹配除了单词字符之外的字符,如字符"/"和"*"等
// 分组不但可以使用数字作为组号,而且还可以使用自定义名称作为组号。
/(?<word>\w+)/
/\b(?<word>\w+)\b\s+\k<word>\b/.test('aa aa');
/\b(?<word>\w+)\b\s+\k<word>\b/.test('aa ab');
// 分组表达式(?<name>)将元字符扩在其中,并强制正则表达式引擎记住该子表达式匹配,同时使用"name"将该匹配进行命名。反向引用\k<name>使引擎对当前字符和以名称“name"存储的先前匹配字符进行比较,从而匹配具有重复字符的字符串。
// (experssion)	匹配字符串experssion,并将匹配的问题并保存到自动命名的组里
// (?<name>experssion)	匹配字符串experssion,并将匹配的文本以name进行命名。该名称不能包含标点符号,不能以数字开头
// (?:experssion)	匹配字符串experssion,不保存匹配的文本,也不给此组分配组号
// (?=experssion)	匹配字符串experssion前面的位置
// (?!experssion)	匹配后面不是字符串experssion前面的位置
// (?<=experssion)	匹配字符串experssion后面的位置
// (?<!experssion)	匹配前面不是字符串experssion的位置
// (?>experssion)	只匹配字符串experssion一次
/\b\w+(?=ed\b)/.test('called');
/\b\w+(?=ed)\b/.test('called');
/(?<=\ban)\w+\b/.test('ana');
/(?<!\d+)[a-z_A-Z]+/.test('1a');
/(?<!\d+)[a-z_A-Z]+/.test('abc3423');
// m	指定多行模式,即修改^和$的含义,以使它们分别与任何行的开头和结尾匹配
// s	指定单行模式
// x	指定消除表达式中的空白字符,并启用字符(#)后面的注释
// 正则表达式优先级顺序表:转义符>圆括号和方括号>限定符>位置和顺序>"或"运算
// 匹配HTML标记之间的内容
/(?<=<(?<tag>\w+)>).*(?=<\/\k<tag>>)/.test('<a>链接有啊</a>');
 // 有些使用元字符\b来指定单词的编辑,有些使用元字符^和$来指定字符串的边界
 // 数值验证方法,主要包括数字验证、整数验证、指定范围的证书验证、实数验证、指定精度的实数验证、科学计数法的数值验证、二进制数值验证、八进制数值验证和十六进制数值验证
 // 组合顺序原则(正整数):依次从他最大值的范围组合刀最小值的范围
 // 组合顺序原则(负整数):依次从绝对值最大值的范围组合刀绝对值最小值的范围
 // 实数0
 /\b0\.0+\b/.test('0.0000');
 /^1(([01]{3,6})|(0{6}[01]))$/.test(10000000);

 

おすすめ

転載: blog.csdn.net/taozi550185271/article/details/106662014