正则表达式(一)

[复制链接]
发表于 2025-9-29 21:03:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、模式(Patterns)和修饰符(flags)

通过正则表达式,我们可以在文本中举行搜刮和更换利用,也可以和字符串方法连合使用。
正则表达式
正则表达式(可叫作 “regexp”,或 “reg”)由 模式 和可选的 修饰符 构成。
语法:
  1. regexp = new RegExp("pattern", "flags");
  2. regexp = /pattern/; // 没有修饰符
  3. regexp = /pattern/gmi; // 带有修饰符
复制代码
斜线 /…/ 告诉 JavaScript 我们正在创建一个正则表达式。它的作用与字符串的引号作用雷同。
注意:
这两种语法之间的告急区别在于,使用斜线 /…/ 的模式不答应插入表达式(如带有 ${…} 的字符串模板)。它是完全静态的。
从动态天生的字符串创建一个正则表达式时,使用new RegExp 例:
  1. let tag = prompt("What tag do you want to find?", "h2");
  2. // 如果在上方输入到 prompt 中的答案是 "h2",则与 /<h2>/ 相同
  3. let regexp = new RegExp(`<${tag}>`);
复制代码
1.修饰符

● i :使用此修饰符后,搜刮时不区分巨细写:A 和 a 之间没有区别
● g :使用此修饰符后,搜刮时会探责备部的匹配项 —— 没有它,则仅返回第一个匹配项。
● m : 多行模式
● s :启用 “dotall” 模式,答应点 . 匹配换行符 \n)。
● u :开启完备的 Unicode 支持。该修饰符可以大概精确处置惩罚署理对。
● y :粘滞(Sticky)模式,在文本中简直切位置搜刮
2.搜刮:str.match()

str.match(regexp) 方法在字符串 str 中探求 regexp 的全部匹配项。
正则表达式具有修饰符 g
  1. //返回一个由所有匹配项所构成的数组:
  2. let str = "We will, we will rock you";
  3. alert( str.match(/we/gi) ); // We,we(由两个匹配的子字符串构成的数组)
  4. console.log(str.match(/we/gi) )
复制代码
请注意,We 和 we 都被找到了,由于修饰符 i 使得正则表达式在举行搜刮时不区分巨细写。
没有修饰符 g

如果没有如许的修饰符,它则会以数组情势返回第一个匹配项,索引 0 处生存着完备的匹配项,返回的效果的属性中尚有一些其他具体信息:
  1. let str = "We will, we will rock you";
  2. let result = str.match(/we/i); // 没有修饰符 g
  3. console.log( result );
  4. console.log( result[0] );     // We(第一个匹配项)
  5. console.log( result.length ); // 1
  6. // 详细信息:
  7. console.log( result.index );  // 0(匹配项的位置)
  8. console.log( result.input );  // We will, we will rock you(源字符串)
复制代码
如果正则表达式中有一部分内容被包在括号里,那么返回的数组大概会有 0 以外的索引。
没有匹配项

如果没有匹配项,则返回 null(无论是否有修饰符 g)。
如果没有匹配项,我们不会收到一个空数组,而是会收到 null。
  1. let matches = "JavaScript".match(/HTML/); // = null
  2. if (!matches.length) { // Error: Cannot read property 'length' of null
  3.   console.log("Error in the line above");
  4. }
复制代码
如果我们盼望的效果始终是数组,可以如许写:
  1. let matches = "JavaScript".match(/HTML/) || [];
  2. if (!matches.length) {
  3.   console.log("No matches"); // 现在可以了
  4. }
复制代码
3.更换:str.replace

str.replace(regexp, replacement) 方法使用 replacement 更换在字符串 str 中找到的 regexp 的匹配项(如果带有修饰符 g 则更换全部匹配项,否则只更换第一个)。
  1. // 没有修饰符 g
  2. alert( "We will, we will".replace(/we/i, "I") ); // I will, we will
  3. // 带有修饰符 g
  4. alert( "We will, we will".replace(/we/ig, "I") ); // I will, I wil
复制代码
l
第二个参数是字符串 replacement。我们可以在此中使用特殊的字符组合来对匹配项举行插入:
符号        在更换字符串中的活动
$&        插入整个匹配项
$`        插入字符串中匹配项之前的字符串部分
$’        插入字符串中匹配项之后的字符串部分
$n        如果 n是一个 1-2位的数字,则插入第 n 个分组的内容
$< name>        插入带有给定 name的括号内的内容
$$        插入字符 $
示例:
  1. console.log( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript
  2. console.log( "I love HTML".replace(/HTML/, "$` and JavaScript") ); // I love I love and JavaScript
  3. console.log( "I love HTML".replace(/HTML/, "$' and JavaScript") ); // I love and JavaScript
复制代码
4.测试:regexp.test
  1. regexp.test(str) 方法寻找至少一个匹配项,如果找到了,则返回 true,否则返回 false。
  2. let str = "I love JavaScript";
  3. let regexp = /LOVE/i;
  4. console.log( regexp.test(str) ); // true
复制代码
末节
● 正则表达式由模式和可选择修饰符构成:g、i、m、u、s 和 y。
●没有修饰符和特殊符号(稍后我们会学到),那么正则表达式的搜刮和子字符串的搜刮雷同。
●str.match(regexp)方法探求匹配项:如果带有修饰符 g,则会返回全部匹配项,否则只会返回第一个匹配项。
● str.replace(regexp,replacement) 方法使用 replacement 更换 regexp 的匹配项:如果带有修饰符
g,则会更换全部匹配项,否则只会更换第一个匹配项。
● regexp.test(str) 方法用于测试,如果找到至少一个匹配项则返回 true,否则返回 false。
二、字符类

字符类(Character classes) 是一种特殊的符号,匹配特定聚集中的任何符号。
起首,让我们探索“数字”类。它写为 \d,对应于“任何一位数字”。
比方,让我们找到电话号码的第一个数字:
  1. let str = "+7(903)-123-45-67";
  2. let regexp = /\d/;
  3. console.log( str.match(regexp) ); // 7
复制代码
如果没有修饰符g,那么正则表达式仅查找第一个匹配项,即第一个数字\d。
这时间可以添加g来查找全部数字:
  1. let str = "+7(903)-123-45-67";
  2. let regexp = /\d/g;
  3. console.log( str.match(regexp) ); // 匹配项构成的数组:7,9,0,3,1,2,3,4,5,6,7
  4. // 让我们将其输出为纯数字构成的电话号码:
  5. console.log( str.match(regexp).join('') ); // 79031234567
复制代码
这是数字的字符类。尚有其他字符类。
最常用的是:
\d(“d” 来自 “digit”) 数字:从 0 到 9 的字符。
\s(“s” 来自 “space”)空格符号:包罗空格,制表符 \t,换行符 \n 和其他少数有数字符,比方 \v、\f 和 \r。
\w(“w” 来自 “word”) “单字”字符:拉丁字母或数字或下划线 _。非拉丁字母(如西里尔字母或印地文)不属于 \w。比方,\d\s\w 表现“数字”,后跟“空格字符”,后跟“单字字符”,比方 1 a。
正则表达式大概同时包罗通例符号和字符类。
比方,CSS\d 匹配 CSS 反面带有一个数字的字符串:
  1. let str = "Is there CSS4?";
  2. let regexp = /CSS\d/
  3. console.og( str.match(regexp) ); // CSS4
复制代码
我们还可以使用更多字符类:
  1. console.log( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
复制代码
1.匹配项(每个正则表达式字符类都有对应的效果字符):

反向类

对于每个字符类,都有一个“反向类”,用雷同的字母表现,但是大写的。
“反向”表现它与全部其他字符匹配,比方:
\D : 非数字:除\d以外的任何字符,比方字母
\S : 非空格符号:除 \s 以外的任何字符,比方字母。
\W : 非单字字符:除 \w 以外的任何字符,比方非拉丁字母或空格。
这个时间就可以使用\D来查找非数字而且将其从字符串中删除:
  1. let str = "+7(903)-123-45-67";
  2. console.log( str.replace(/\D/g, "") ); // 79031234567
复制代码
点(.)匹配“任何字符”

点 . 是一种特殊字符类,它与“除换行符之外的任何字符”匹配(只匹配一个字符)。
  1. console.log("Z".match(/./)) ; //Z
复制代码
大概在正则表达式中心:
  1. let regexp = /CS.4/;
  2. console.log( "CSS4".match(regexp) ); // CSS4
  3. console.log( "CS-4".match(regexp) ); // CS-4
  4. console.log( "CS 4".match(regexp) ); // CS 4(空格也是一个字符)
复制代码
点表现“任何字符”,而不是“缺少字符”。必须有一个与之匹配的字符:
  1. console.log( "CS4".match(/CS.4/) ); // null,没有匹配项,因为这里没有与点匹配的字符
  2. console.log( "CSSS4".match(/CS.4/) ); // null,没有匹配项,因为只能匹配一个字符这里中间有两个S
复制代码
带有修饰符 “s” 时点字符类匹配任何字符

默认情况下,点与换行符 \n 不匹配。
比方,正则表达式 A.B 匹配 A,然后匹配 B 和它们之间的任何字符,除了换行符\n:
  1. console.log( "A\nB".match(/A.B/) ); // null(无匹配项)
复制代码
如果要匹配任何字符,那么就可以使用修饰符s,如果有s修饰符那么点 .就可以匹配任何字符
  1. console.log("A\nB".match(/A.B/s) ) // A\nB
复制代码
‘注意:这里的点仍然只可以匹配一个字符,如果有多个字符,那么效果会是null,如果要匹配多个字符,那么字符数与点的数量雷同。` 注意:这里的点仍然只可以匹配一个字符,如果有多个字符,那么效果会是null,如果要匹配多个字符,那么字符数与点的数量雷同。‘注意:这里的点仍然只可以匹配一个字符,如果有多个字符,那么效果会是null,如果要匹配多个字符,那么字符数与点的数量雷同。`
示例:
  1. console.log("ACMB".match(/A..B/s) ) // ACMB
复制代码
三、Unicode:修饰符 “u” 和类 \p{…}

JavaScript 对字符串使用 Unicode 编码。大多数字符使用 2 个字节编码,但这种方式只能编码最多 65536 个字符。
这个范围不敷以对全部大概的字符举行编码,这就是为什么使用 4 个字节对一些有数的字符举行编码,好比 𝒳(数学符号 X)或 😄(笑容),一些象形笔墨等等。
字符        Unicode        Unicode 中的字节数
a        0x0061        2
≈        0x2248        2
𝒳        0x1d4b3        4
𝒴        0x1d4b4        4
😄        0x1f604        4
1.Unicode 属性 \p{…}

Unicode 中的每个字符都有很多属性。它们形貌了字符所属的“种别”,包罗了关于字符的各种信息。
比方,如果一个字符具有 Letter 属性,这意味着这个字符归属于(恣意语言的)字母表。而 Number 属性则表现这是一个数字:大概是阿拉伯数字,亦或是中文数字,等等。
我们可以查找具有某种属性的字符,写作 \p{…}。为了使用 \p{…},一个正则表达式必须使用修饰符 u。
  1. let str = "A ბ ㄱ";
  2. alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ
  3. alert( str.match(/\p{L}/g) ); // null(没有匹配项,因为没有修饰符 "u")
复制代码
以下是告急的字符种别和它们对应的子种别:
● 字母(Letter)L:
○ 小写(lowercase)Ll,
○ 修饰(modifier)Lm,
○ 首字母大写(titlecase)Lt,
○ 大写(uppercase)Lu,
○ 别的(other)Lo。
● 数字(Number)N:
○ 十进制数字(decimal digit)Nd,
○ 字母数字(letter number)Nl,
○ 别的(other)No。
● 标点符号(Punctuation)P:
○ 毗连符(connector)Pc,
○ 横杠(dash)Pd,
○ 起始引号(initial quote)Pi,
○ 竣事引号(final quote)Pf,
○ 开(open)Ps,
○ 闭(close)Pe,
○ 别的(other)Po。
● 标记(Mark)M(accents etc):
○ 隔断归并(spacing combining)Mc,
○ 封闭(enclosing)Me,
○ 非隔断(non-spacing)Mn。
● 符号(Symbol)S:
○ 钱币(currency)Sc,
○ 修饰(modifier)Sk,
○ 数学(math)Sm,
○ 别的(other)So。
● 分隔符(Separator)Z:
○ 行(line)Zl,
○ 段落(paragraph)Zp,
○ 空格(space)Zs。
● 别的(Other)C:
○ 控制符(control)Cc,
○ 格式(format)Cf,
○ 未分配(not assigned)Cn,
○ 私有(private use)Co,
○ 署理伪字符(surrogate)Cs。
也有别的派生的种别,比方:
● Alphabetic(Alpha),包罗了字母 L,加上字母数字 Nl(比方 Ⅻ —— 罗马数字 12),加上一些别的符号 Other_Alphabetic(OAlpha)。
● Hex_Digit 包罗 16 进制数字 0-9,a-f。
● ……等等。
Unicode 支持很多差异的属性,列出整个清单须要占用大量的篇幅,因此在这里列出干系的链接:
● 列出一个字符的全下属性:https://unicode.org/cldr/utility/character.jsp.
● 按照属性列出全部的字符:https://unicode.org/cldr/utility/list-unicodeset.jsp.
● 属性的对应缩写情势:https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt.
● 以文本格式整理的全部 Unicode 字符,包罗了全部的属性:https://www.unicode.org/Public/UCD/latest/ucd/.
举例:16进制数
查找16进制数,写作 xFF 此中 F 是一个 16 进制的数字(0…9 大概 A…F)。
一个 16 进制数字可以表现为 \p{Hex_Digit}:
  1. let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
  2. alert("number: xAF".match(regexp)); // xAF
复制代码
举例:中笔墨符
有一个 Unicode 属性 Script(一个誊写体系),这个属性大概有一个值:Cyrillic、Greek、Arabic、Han(中文)等等,这里是一个完备的列表。
要在给定的誊写体系中查找字符,我们须要使用 Script=,比方对于西里尔字母:\p{sc=Cyrillic},中文象形笔墨:\p{sc=Han},等等。
  1. let regexp = /\p{sc=Han}/gu; // 返回中文象形文字
  2. let str = `Hello Привет 你好 123_456`;
  3. alert( str.match(regexp) ); // 你,好
复制代码
举例:钱币
表现钱币的字符,比方 $、€ 和 ¥,具有 Unicode 属性 \p{Currency_Symbol},缩写为 \p{Sc}。
  1. let regexp = /\p{Sc}\d/gu; //查找所有的货币符号以及数字
  2. let str = `Prices: $2, €1, ¥9`;
  3. alert( str.match(regexp) ); // $2,€1,¥9
复制代码
总结

修饰符 u 表现启用正则表达式中对 Unicode 的支持。
这意味着两件事:

  • 4 个字节长的字符被以精确的方式处置惩罚:被看成单个字符,而不是 2 个 2 字节长的字符。
  • Unicode 属性可以被用于查找:\p{…}。
    有了 unicode 属性我们可以查找给定语言中的词,特殊字符(引用,钱币)等等。
    四、锚点:字符串开始 ^ 和末端 $
    插入符号 ^ 和美元符号 $ 在正则表达式中具有特殊的寄义。它们被称为“锚点”。
    插入符号 ^ 匹配文本开头,而美元符号 $ 则匹配文本末端。
    let str = “张三”;
    console.log(/^张/.test(str)) //true 判断是否以伸开头
    let str1 = “李四”;
    alert( /四/.test(str1));//true判断是否以四末了测试完全匹配.../.test(str1) ); // true 判断是否以四末了测试完全匹配^.../.test(str1));//true判断是否以四末了测试完全匹配...连合使用。示比方下:
    //测试一个字符串是否是 12:34(\d\d:\d\d) 格式的时间
    let time1 = “01:13”;
    let time2 = “01:134”;
    let regexp = /^\d\d:\d\d$/;
    console.log(regexp.test(time1)) // true
    console.log(regexp.test(time2))// false
五、锚点 ^ $ 的多行模式,修饰符 “m”

多行模式由修饰符 m 启用。
它只影响 ^ 和 $ 的活动。
在多行模式下,它们不但仅匹配文本的开始与末端,还匹配每一行的开始与末端。
搜刮行的开头
  1. let str = `1one
  2. 2two
  3. 3three`;  //注意:每行内容一定要在编辑器最左边,否则会默认为是一行内容中间为空格
  4. console.log(str.match(/^\d/gm)) // [1,2,3]
复制代码
没有修饰符 m 时,仅会匹配第一个数字:
  1. let str = `1st place: Winnie
  2. 2nd place: Piglet
  3. 3rd place: Eeyore`;
  4. console.log( str.match(/^\d/g) ); // 1
复制代码
注意:“行的开头”表现“就在换行符之后”:多行模式下的测试 ^ 匹配全部以换行符 \n 开头的位置。以及在文本开始的位置。
搜刮行的末端 $
正则表达式 \d$ 探求每行的末了一个数字
  1. let str = `red:1
  2. yellow:2
  3. green:3
  4. `;
  5. //没有修饰符 m,那么美元符 $ 将只会匹配整个文本的末尾,所以只有最后一个数字会被匹配。
  6. consoel.log(str.match(/\d$/gm));//[1,2,3]
复制代码
注意:“行的末端”表现“就在换行符之前”:多行模式下的测试 $ 匹配全部以换行符 \n 末了的位置。以及在文本末端的位置。
搜刮 \n 而不是 ^ $
要探求新的一行,我们不但可以使用锚点 ^ 和 $,也可以使用换行符 \n。
  1. let str = `Winnie: 1
  2. Piglet: 2
  3. Eeyore: 3`;
  4. console.log( str.match(/\d\n/g) ); // 1\n,2\n
复制代码
区别:

  • 这里只匹配到了两个,由于3之后没有换行了
  • 现在每个匹配项都包罗换行符。与锚点^ $差异,锚点只测试条件(行的开始与末端),而\n是一个字符,因此效果中有\n。 我们须要效果中有换行符时,使用 \n。而锚点则用于在行的开头/末端查找某些内容。
六、竣事语

本节正则表达式就到此竣事了,但是正则表达式的内容还不但这些,下一节会继承解说正则表达式的使用,接待小搭档们来参阅,不要忘记点赞加加关注哦。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表