We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
记得上一次系统的学习正则表达式,还是刚学前端的事,现在过去那么久了,现在有必要将正则给补一补,也许这一次会有不同的感悟。
n
\n
\\
\
\(
(
RegExp
Multiline
^
\r
$
zo
z
zoo
{0,}
zo+
+
1,
do(es)?
does
do
?
{0,1}
o{2}
Bob
o
food
o{2,}
foooood
o{1,}
o+
o{0,}
o*
m
n<=m
o{1,3}
fooooood
o{0,1}
o?
(*,+,?,{n},{n,},{n,m})
oooo
o+?
(.|\n)
pattern
Matches
VBScript
SubMatches
JScript
$0…$9
x
y
[abc]
plain
a
[^abc]
p
[a-z]
[^a-z]
er\b
never
er
verb
er\B
\cM
Control-M
A-Z
a-z
c
[0-9]
[^0-9]
\x0c
\cL
\x0a
\cJ
\x0d
[ \f\n\r\t\v]
[^ \f\n\r\t\v]
\x09
\cI
\x0b
\cK
[A-Za-z0-9_]
[^A-Za-z0-9_]
\x41
A
\x041
\x04&1
ASCII
| | \num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。 | | \n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 | | \nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 | | \nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 | | \un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。 |
num
(.)\1
(0-7)
\nm
nm
(0-3)
nml
Unicode
\u00A9
(©)
当你想要知道在一个字符串中的一个匹配是否被找到,你可以使用test或search方法;想得到更多的信息(但是比较慢)则可以使用exec或match方法。如果你使用exec或match方法并且匹配成功了,那么这些方法将返回一个数组并且更新相关的正则表达式对象的属性和预定义的正则表达式对象(详见下)。如果匹配失败,那么exec方法返回null(也就是false)。
test
search
exec
match
null
false
var myRe = /d(b+)d/g; var myArray = myRe.exec("cdbbdbsbz");
输出:
["dbbd", "bb", index: 1, input: "cdbbdbsbz", groups: undefined]
["dbbd", "bb"] 匹配到的字符串和所有被记住的子字符串。
["dbbd", "bb"]
index 在输入的字符串中匹配到的以0开始的索引值。
index
input 初始字符串。
input
lastIndex 下一个匹配的索引值。(这个属性只有在使用g参数时可用在 通过参数进行高级搜索 一节有详细的描述.)
lastIndex
source 模式文本。在正则表达式创建时更新,不执行。
source
一个正则表达式模式使用括号,将导致相应的子匹配被记住。例如,/a(b)c /可以匹配字符串“abc”,并且记得“b”。回调这些括号中匹配的子串,使用数组元素[1],……[n]。
/a(b)c /
abc
b
[1],……[n]
使用括号匹配的子字符串的数量是无限的。返回的数组中保存所有被发现的子匹配。下面的例子说明了如何使用括号的子字符串匹配。
下面的脚本使用replace()方法来转换字符串中的单词。在匹配到的替换文本中,脚本使用替代的$ 1,$ 2表示第一个和第二个括号的子字符串匹配。
replace()
$ 1,$ 2
var re = /(\w+)\s(\w+)/; var str = "John Smith"; var newstr = str.replace(re, "$2, $1"); console.log(newstr);
输出结果:
Smith, John
正则表达式有四个可选参数进行全局和不分大小写搜索。这些参数既可以单独使用也可以一起使用在任何顺序和包含正则表达式的部分中。
var str = "get-element-by-id"; var reg = /-\w/g; str.replace(reg, (val) => { return val.slice(1).toUpperCase(); }); //"getElementById"
var str = "10101111"; var reg = /^[01]+$/g; console.log(reg.test(str));
var str = "81"; var reg = /^(?!0)\d+$/; console.log(reg.test(str));
var str = "0101212312"; var reg = /^[^0]\d+$/g; console.log(reg.test(str)); //false
var str = "12345678901"; function numSplit(str){ var re = /(\d)(?=(\d{3})+$)/g; //(\d{3})+$ 的意思是连续匹配 3 个数字,且最后一次匹配以 3 个数字结尾。 //要找到所有的单个字符,这些字符的后面跟随的字符的个数必须是3的倍数,并在符合条件的单个字符后面添加, return str.replace(re,'$1,'); } console.log(numSplit(str));//12,345,678,901
var str="dgfhfgh254bhku289fgdhdy675"; var re=/(\d+)/g; console.log(str.match(re));
var str = "qjvj58h7vv9n57v55v5jj"; var n = -1; while ((new RegExp("(.)(.*?\\1){"+(++n)+"}")).test(str)); console.log("出现次数最多的字符是 "+RegExp.$1+",出现次数 "+n);
解释一下
.
(.)
.*
(.)(.*\\1)
(.)(.*?\\1)
\1
\\1
var str = "xxxyyyyyyz"; str = str.replace(/(.)\1+/ig,function(s,a){return s.length+a;}); console.log(str);
i
var str = 'a2s3s2d2d3dsfas'; var reg = /(\w)\1/ig console.log(reg.test(str));
var reg = /(0.\d+)|(\d+.\d+)/; console.log(reg.test('0')); // false console.log(reg.test('0.5')); // true console.log(reg.test('d0.5')); // true console.log(reg.test('d0.5s')); // true console.log(reg.test('d0.a5s')); // false
如果有地方不合理的,麻烦提出来一下
《js正则表达式常见面试题》 《【大家一起来思考】近段时间整理的...》 《js正则表达式常见面试题》 《MDN》
The text was updated successfully, but these errors were encountered:
No branches or pull requests
前言
记得上一次系统的学习正则表达式,还是刚学前端的事,现在过去那么久了,现在有必要将正则给补一补,也许这一次会有不同的感悟。
正则的速查表
n
"匹配字符"n
"。"\n
"匹配一个换行符。串行"\\
"匹配"\
"而"\(
"则匹配"(
"。RegExp
对象的Multiline
属性,^
也匹配“\n
”或“\r
”之后的位置。RegExp
对象的Multiline
属性,$
也匹配“\n
”或“\r
”之前的位置。zo
*能匹配“z
"以及"zoo
"。*等价于{0,}
。zo+
"能匹配"zo
"以及"zoo
",但不能匹配"z
"。+
等价于{1,
}。do(es)?
”可以匹配"does
"或"does
"中的"do
"。?
等价于{0,1}
。n
是一个非负整数。匹配确定的n
次。例如,“o{2}
”不能匹配"Bob
"中的"o
",但是能匹配"food
"中的两个o
。n
是一个非负整数。至少匹配n次。例如,"o{2,}
"不能匹配"Bob
"中的"o
",但能匹配"foooood
"中的所有o
。"o{1,}
"等价于"o+
"。"o{0,}
"则等价于"o*
"。m
和n
均为非负整数,其中n<=m
。最少匹配n次且最多匹配m
次。例如,"o{1,3}
"将匹配"fooooood
"中的前三个o
。"o{0,1}
"等价于"o?
"。请注意在逗号和两个数之间不能有空格。(*,+,?,{n},{n,},{n,m})
后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串"oooo
","o+?
"将匹配单个"o
",而"o+
"将匹配所有"o
"。\n
”之外的任何单个字符。要匹配包括“\n
”在内的任何字符,请使用像“(.|\n)
”的模式。pattern
并获取这一匹配。所获取的匹配可以从产生的Matches
集合得到,在VBScript
中使用SubMatches
集合,在JScript
中则使用$0…$9
属性。要匹配圆括号字符,请使用“(”或“)”。pattern
但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“`(pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“`Windows(?=95pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“`Windows(?!95x
或y
。例如,“`z[abc]
”可以匹配“plain
”中的“a
”。[^abc]
”可以匹配“plain
”中的“p
”。RegExp
对象的Multiline
属性,$
也匹配“\n
"或"\r
"之前的位置。[a-z]
”可以匹配“a
”到“z
”范围内的任意小写字母字符。[^a-z]
”可以匹配任何不在“a
”到“z
”范围内的任意字符。er\b
”可以匹配“never
”中的“er
”,但不能匹配“verb
”中的“er
”。er\B
”能匹配“verb
”中的“er
”,但不能匹配“never
”中的“er
”。\cM
匹配一个Control-M
或回车符。x
的值必须为A-Z
或a-z
之一。否则,将c
视为一个原义的“c
”字符。[0-9]
。[^0-9]
。\x0c
和\cL
。\x0a
和\cJ
。\x0d
和\cM
。[ \f\n\r\t\v]
。[^ \f\n\r\t\v]
。\x09
和\cI
。\x0b
和\cK
。[A-Za-z0-9_]
”。[^A-Za-z0-9_]
”。n
,其中n
为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41
”匹配“A
”。“\x041
”则等价于“\x04&1
”。正则表达式中可以使用ASCII
编码。.|
| \num | 匹配
num
,其中num
是一个正整数。对所获取的匹配的引用。例如,“(.)\1
”匹配两个连续的相同字符。 || \n | 标识一个八进制转义值或一个向后引用。如果
\n
之前至少n
个获取的子表达式,则n
为向后引用。否则,如果n
为八进制数字(0-7)
,则n
为一个八进制转义值。 || \nm | 标识一个八进制转义值或一个向后引用。如果
\nm
之前至少有nm
个获得子表达式,则nm
为向后引用。如果\nm
之前至少有n
个获取,则n
为一个后跟文字m
的向后引用。如果前面的条件都不满足,若n
和m
均为八进制数字(0-7)
,则\nm
将匹配八进制转义值nm
。 || \nml | 如果
n
为八进制数字(0-3)
,且m和l均为八进制数字(0-7)
,则匹配八进制转义值nml
。 || \un | 匹配
n
,其中n
是一个用四个十六进制数字表示的Unicode
字符。例如,\u00A9
匹配版权符号(©)
。 |使用正则表达式的方法
当你想要知道在一个字符串中的一个匹配是否被找到,你可以使用
test
或search
方法;想得到更多的信息(但是比较慢)则可以使用exec
或match
方法。如果你使用exec
或match
方法并且匹配成功了,那么这些方法将返回一个数组并且更新相关的正则表达式对象的属性和预定义的正则表达式对象(详见下)。如果匹配失败,那么exec
方法返回null
(也就是false
)。输出:
["dbbd", "bb"]
匹配到的字符串和所有被记住的子字符串。index
在输入的字符串中匹配到的以0开始的索引值。input
初始字符串。lastIndex
下一个匹配的索引值。(这个属性只有在使用g参数时可用在 通过参数进行高级搜索 一节有详细的描述.)source
模式文本。在正则表达式创建时更新,不执行。使用括号的子字符串匹配
一个正则表达式模式使用括号,将导致相应的子匹配被记住。例如,
/a(b)c /
可以匹配字符串“abc
”,并且记得“b
”。回调这些括号中匹配的子串,使用数组元素[1],……[n]
。使用括号匹配的子字符串的数量是无限的。返回的数组中保存所有被发现的子匹配。下面的例子说明了如何使用括号的子字符串匹配。
下面的脚本使用
replace()
方法来转换字符串中的单词。在匹配到的替换文本中,脚本使用替代的$ 1,$ 2
表示第一个和第二个括号的子字符串匹配。输出结果:
通过标志进行高级搜索
正则表达式有四个可选参数进行全局和不分大小写搜索。这些参数既可以单独使用也可以一起使用在任何顺序和包含正则表达式的部分中。
例子
给一个连字符串例如:get-element-by-id转化成驼峰形式。
匹配二进制数字
分割数字每三个以一个逗号划分
如何获取一个字符串中的数字字符,并按数组形式输出
求一串字符串中出现次数最多的字符和其出现的次数
解释一下
.
代表任意一个字符。(.)
选择任意一个字符进行复制。.*
代表任意一个字符后面有0个或者多个字符。(.)(.*\\1)
是否存在一个或多个字符与它相同。(.)(.*?\\1)
表示是非贪婪模式。\1
匹配和正则表达式中的括号(计算左括号)中出现相同内容的内容,数字代表匹配第几个括号。\\1
代表第一个圆括号里面的内容是否相同。压缩字符串(例如:abcbc压缩后依然是abcbc,而xxxyyyyyyz压缩后就是3x6yz)
i
不区分大小写判断是否含有连续字符
匹配一个字符串中的正浮点数
最后
如果有地方不合理的,麻烦提出来一下
参考文章:
《js正则表达式常见面试题》
《【大家一起来思考】近段时间整理的...》
《js正则表达式常见面试题》
《MDN》
The text was updated successfully, but these errors were encountered: