正则表达式的用途实在太广泛了,各种编程语言都需要用到它,在这里写下对于正则表达式的一点儿个人理解,希望能帮助到需要的人。
正则表达式主要分为两部分:
字符:
. : 表示任意单个字符
\w :表示字母或数字a-zA-Z0-9, \W则与\w相反, 这样一正一反下来,就表示所有的字符,完全的,一字不漏的。
\s : 表示空白字符,包括空格,制表符,回车, \S表示与\s相反。
\d : 表示数字0-9, \D 表示与\d相反。
[] : 要做更精确地匹配,可以用[]表示范围, [0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线;
| : A|B
可以匹配A或B,所以(J|j)ava(S|s)cript
可以匹配'JavaScript'
、'Javascript'
、'javaScript'
或者'javascript'
。
注意, (J|j)ava(S|s)cript 是加了分组功能的, 什么是分组?
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()
表示的就是要提取的分组(Group)。
^ :
表示行的开头,^\d
表示必须以数字开头,^还能做为取反使用,例如[^abc]表示不包含a,b和c。
$ :
表示行的结束,\d$
表示必须以数字结束。
字符就介绍到这里,基本够用了。
字符个数(限定符):
上面介绍了正则表达式常用的字符,但是一个完整的正则表达式必须要包含字符+字符个数,下面介绍常用的表达字符个数的方式:
? : 表示0个或1一个字符, 例如"\w?" 表示0个或者1个 字母或数字。除了表示个数,?还可以用于阻止贪婪匹配,可以在正则表达式后面加个?,例如\d+贪婪匹配所有数字,\d+?就可以让\d+采用非贪婪匹配
* : 表示任意个字符(包括0个)。怎样指定某个字符串的个数?用小括号括起来,(abc)*,可以匹配abc,abcabc...............
+: 表示至少一个字符。
{n}:表示n个字符。
{n,m}:表示n到m个字符。
总结:
正则表达式其实就是字符+字符个数,掌握这个窍门,只要不是特别困难的情况下,基本是够用了。
非获取匹配:
以上的知识应该能够应付大部分的需求了,我们来看一下另外一种情况:第三项中(用户名)含有敏感信息,请将其替换为 "xxxxxx"
"success","1","admin","2020-11-10T01:20:30"
"success","2","testuser","2020-11-10T01:21:30"
怎么找到第三项呢? 使用非获取匹配,也就是说将前三项都写到正则表达式中,但是前两项写为非获取匹配,最终就能只匹配到第三项
这里给出一个答案:反向肯定预查 (?<=(\"\w*\",\"\w*\",))\"\w*\"
下面给出几个常用的非获取匹配:
Note:是能够全部匹配,然后能够返回自己需要的部分字符串
(?=pattern) | 非获取匹配 -> 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。 举例说明,“Linux(?=3.0|3.1|3.2|3.3)”能匹配“Linux3.1”中的“Linux”,但不能匹配“Linux4.0”中的“Linux”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 非获取匹配 -> 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配同样不需要获取供以后使用。 举例说明,“Linux(?!3.0|3.1|3.2|3.3)”能匹配“Linux4.0”中的“Linux”,但不能匹配“Linux3.0”中的“Linux”。与正向肯定预查(?=pattern)正好相反 |
(?<=pattern) | 非获取匹配 -> 反向肯定预查,与正向肯定预查类似,只是方向相反,即放置位置相反,一个在前(反向),一个在后(正向)。 举例说明,“(?<=xp|7|10)Windows”能匹配“10Windows”中的“Windows”,但不能匹配“98Windows”中的“Windows”。 |
(?<!pattern) | 非获取匹配 -> 反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!xp|7|10)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“10Windows”中的“Windows”。 |
(?:pattern) | 非获取匹配,匹配pattern但不获取匹配结果,不进行存储(不进行分组,上面几个都会存储分组)供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。 举例说明,“industr(?:y|ies)”能够匹配"industries"中的"industr"。“industr(?:y|ies)”是一个比“industry|industries”更简略的表达式。 |
当然可以配合使用, 下面的例子中将网址www.google.com匹配出来
<a target=_blank href="www.google.com">谷歌浏览器</a>
正则表达式:(?<=(href=")).{1,100}(?=(">)), 同时使用了反向肯定预查和正向肯定预查。注意,这里是做了分组的。
经典使用范例:
可以在这个网址: 在线正则表达式测试, 去验证自己所写的正则表达式。
在这个网址中,即可以验证自己的正则表达式,又可以测试匹配后的替换功能。例如下面的例子中可以匹配用户名,并且将用户名替换为"xxxxxx"。