You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 方法 1functionremoveCc(str){returnstr.replace(/([A-Z])/g," $1");}// 方法 2functionremoveCc(str){returnstr.replace(/[A-Z]/g,(match)=>" "+match);}// testconsole.log(removeCc("camelCase"));// 'camel Case'console.log(removeCc("helloWorldItIsMe"));// 'hello World It Is Me'
前言
本文纪录 Javascript 正则表达式的语法学习实践。
正则常见使用场景:
在线工具辅助学习:
使用规则说明
基本语句
正则表达式(可叫作 “regexp”,或 “reg”)包扩 模式 和可选的 修饰符。
有两种创建正则表达式对象的语法。
较长一点的语法:
较短一点的语法,使用斜线 "/":
这两种语法之间的主要区别在于,使用斜线
/.../
的模式不允许插入表达式(如带有${...}
的字符串模板)。它是完全静态的。在我们写代码时就知道正则表达式时则会使用斜线的方式 —— 这是最常见的情况。当我们需要从动态生成的字符串“动态”创建正则表达式时,更经常使用
new RegExp
。例如:修饰符
m 修饰符多行模式:
在这个有多行文本的例子中,模式
/^\d/gm
将从每行的开头取一个数字:没有修饰符
m
时,仅会匹配第一个数字1
。修饰符 y 的搜索:
转义,特殊字符
正则中存在特殊字符,这些字符在正则表达式中有特殊的含义,例如
[ ] { } ( ) \ ^ $ . | ? * +
。它们用于执行更强大的搜索。要将特殊字符用作常规字符,请在其前面加上反斜杠:
\
, 这就是转义符。当将字符串传递给给 new RegExp 时,我们需要双反斜杠
\\
,因为字符串引号会消耗一个反斜杠:锚点:^ 和 $
边界符:\b 和 \B
\b 如插入符号那样表示一个锚点(它与$和^相同)来匹配位置,其中一边是一个单词符号(如\w),另一边不是单词符号(例如它可能是字符串的起始点或空格符号)。
它同样能表达相反的非单词边界「\B」,它会匹配「\b」不会匹配的位置,如果我们希望找到被单词字符环绕的搜索模式,就可以使用它。
重复量词符:*、+、?和 {}
或运算符:| 、 []
字符类:\d、\w、\s
反向字符类:\D、\W、\S
对于每个字符类,都有一个“反向类”,用相同的字母表示,但是大写的。
通配字符:.
. 匹配“任何字符”, 它与“除换行符之外的任何字符”匹配。
中级语句
捕获组:()
捕获作用
(exp)
匹配 exp,并捕获文本到自动命名的组里(?<name>exp)
匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?'name'exp)
(?:exp)
— 匹配 exp,不捕获匹配的文本位置指定
(?=exp)
匹配 exp 前面的位置(?<=exp)
匹配 exp 后面的位置(?!exp)
匹配后面跟的不是 exp 的位置(?<!exp)
匹配前面不是 exp 的位置集合和范围:[]
记住在方括弧内,所有特殊字符(包括反斜杠\)都会失去它们应有的意义。
贪婪量词和惰性量词
数量符(* + {})是一种贪心运算符,所以它们会遍历给定的文本,并尽可能匹配。例如,<.+> 可以匹配文本
「This is a <div> simple div</div> test」中的「<div>simple div</div>」
。为了仅捕获 div 标签,我们需要使用「?」令贪心搜索变得 Lazy 一点:注意更好的解决方案应该需要避免使用「.」,这有利于实现更严格的正则表达式:
更多懒惰匹配:
总结:
量词有两种工作模式:
(1)贪婪模式
默认情况下,正则表达式引擎会尝试尽可能多地重复量词字符。例如,
\d+
会消耗所有可能的字符。当无法消耗更多(在尾端没有更多的数字或字符串)时,然后它再匹配模式的剩余部分。如果没有匹配,则减少重复的次数(回溯),并再次尝试。(2)惰性模式
通过在量词后添加问号
?
来启用。正则表达式引擎尝试在每次重复量化字符之前匹配模式的其余部分。正如我们所见,惰性模式并不是贪婪搜索的“灵丹妙药”。另一种方式是使用排除项“微调”贪婪搜索,如模式
"[^"]+"
。高级语句
前瞻断言与后瞻断言
x(?=y)
— 前瞻断言(零宽先行断言):匹配 x,不过是只在 x 后跟 y 时才匹配。x(?!y)
— 否定前瞻断言:匹配 x,不过是只在 x 后不跟 y 时才匹配。(?<=y)x
— 肯定的后瞻断言(零宽后行断言):匹配 x,仅在前面是 y 的情况下。(?<!y)x
— 否定的后瞻断言:匹配 x,仅在前面不是 y 的情况下。(1)前瞻断言例子:
比如
\b\w+(?=ing\b)
,匹配以 ing 结尾的单词的前面部分(除了ing 以外的部分),如果在查找
I'm singing while you're dancing.
时,它会匹配sing
和danc
。(2)后瞻断言例子:
比如
(?<=\bre)\w+\b
会匹配以re
开头的单词的后半部分(除了 re 以外的部分),例如在查找reading a book
时,它匹配ading
。(3)下面这个例子同时使用了前缀和后缀:
(?<=\s)\d+(?=\s)
匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
模式中的反向引用:\N 和 \k
按编号反向引用:
\N
我们可以将两种引号都放在方括号中:
['"](.*?)['"]
,但它会找到带有混合引号的字符串,例如"...'
和'..."
。当一种引号出现在另一种引号内,比如在字符串"She's the one!"
中时,便会导致不正确的匹配:为了确保模式查找的结束引号与开始的引号完全相同,我们可以将其包装到捕获组中并对其进行反向引用:
(['"])(.*?)\1
。正则表达式引擎会找到第一个引号
(['"])
并记住其内容。那是第一个捕获组。在模式中
\1
表示“找到与第一组相同的文本”,在我们的示例中为完全相同的引号。与此类似,
\2
表示第二组的内容,\3
—— 第三分组,依此类推。按命名反向引用:
\k<name>
如果一个正则表达式中有很多括号,给它们起个名字会便于引用。
要引用命名的捕获组,我们可以使用:
\k<name>
。在下面的示例中,带引号的组被命名为
?<quote>
,因此反向引用为\k<quote>
:正则手纪 —— 方法篇预告
Replace
思路分析:
[A-Z]
可以匹配出C
C
之前加入空格,需要拿到C
做变更我们需要用捕获括号!捕获括号允许匹配一个值,并且记住它,这样之后就可以用它!
最后实现捕获括号呢?用字符串的 .replace() 方法!我们插入 '$1' 为第二个参数(注意这里一定要用引号)
方法 2:replace() 也可以指定一个函数作为第二个参数
使用
^
去命中首字母,配合[a-z]
选择首字母中小写的情况Test
规则指定,手机号码除
12
和11
开头的 11 位数字视为有效Match
尽可能的取出乱码字符串中的中文及有效符号
匹配出地址:
参考链接
The text was updated successfully, but these errors were encountered: