标签:第一个字符 分类 字段 元字符 怎么 空格 this 数字 对象
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
假设有一段话如下:
These are some phone numbers 917-555-1234. Also, you can call me
at 646.555.1234 and of course I‘m always reachable at (212)867-5309.
假设有一段话如下:
The colors of the rainbow have many colours
and the rainbow does not have a single colour.
我们想把所有的“颜色”找出来,即colors colours colour
可用colou?rs?
另外也可以匹配一行中的4个数字,或者一行中的5个字母。如找5个字母组成的单词:
\w{5} 这样可以吗?不行的,看下它匹配的内容,如下:
These are some phone numbers 915-555-1234...
的确,我们模板给的很简单,它只找一行中,连续出现5个字母的序列。
\w{5}\s 为了能找到单词,所以希望5个字母后,跟一个空格的序列,看下匹配情况:
These are some phone numbers 915-555-1234...
可以得出,只有目前这些方法,是做不到的。
This is somthing
is about
a blah
words
sequence of words
Hello and
GoodBye and
Go gogo!
来看下各种正则所匹配的内容:
回到刚才的问题:现在想找5个字母组成的单词,是使用单词结界符\b,答案即\b\w{5}\b。
找一个刚才出现的电话号123-456-1231:
用以上最基本的正则方法就是 \d{3}-\d{3}-\d{4},这样就找到了。但是有的时候,电话号码是(212)867-4233的结构怎么办呢?正则表达式中的其他表达方式,下面一一来介绍。
分类符[]用来表示逻辑关系或,比如[abc]表示a或者b或c,[-.]表示符号-或者.号。
注:在[]中的.号代表的就是这个符号,但是如果在其外面,表示个匹配所有。所以如果不在[]之中,想要匹配‘.‘,就要通过转意符号\.来进行匹配。
字符序列:The lynk is quite a link don‘t you think? l nk l(nk
正则表达式: l[yi (]nk
结果:lynk link l nk l(nk
有以下字段,请匹配所有可能的电话号码:
These are some phone numbers 915-134-3122. Also,
you can call me at 643.123.1333 and of course,
I‘m always reachable at (212)867-5509
一步一步来,刚才我们使用\d{3}-\d{3}-\d{4}匹配了连字符的情况。现在我们可以很轻松的把 . 这种情况加进去了:
这里还是要说明,在[]中,特殊字符不需要转义,可以直接使用,比如[.()],但是在外面,是需要转义的( .等。
刚才介绍了最简单和基本的功能,但是有些特殊的地方需要注意:
除了使用[]表示或逻辑,()也是可以的。用法是(a|b)表示a或者b。比如下面的例子,匹配所有email:
这样就可以匹配邮箱了。但是还有一个问题,因为邮箱用户名是可以有.的,比如XXXX@126.com
其实仍然很简单,修复如下:[\w.]+@\w+.(com|net|edu)
所以,()的强大功能是什么呢? 分组捕获,这对序列的替换、交换是很有帮助的。后面会提到。
回到之前电话号码的例子,保留区号,并把后面的电话号码变为通用性的:
212-xxx-xxxx
915-xxx-xxxx
212-555-1234 Group0
555 Group1
1234 Group2
组已经分好,有两种方法选择已经匹配的分组:
现在把212-555-1234变成212-xxx-xxxx,表达式如下:
reg: \(?(\d{3})[-.)]\d{3}[-.]\d{4}
replace: $1-xxx-xxxx
shiffina, Daniel
shifafl, Daniell
shquer, Danny
实现方法:
reg: (\w+),\s(\w+)
replace: $2 $1
注意:$0 是所有匹配到的,所以第一个加括号的是$1
[google](https://google.com)
[itp](https://itp.nyu.edu)
[Coding Rainbow](https://codingrainbow.com)
此题易错,看到[google]时最易想到的正则表达式是\[.*\],但如果第一行变成:
[google](https://google.com),[test]
那么,这一整行都会被匹配。而不能区分[google]和[test]。原因是 . 是贪婪的,会匹配所有能匹配到的,所以当然也包括了 ] ,一直到这一行的最后一个 ] ,它才停止。
所以为了让它能正确匹配,需要去掉这种贪婪的属性。这里用到 ? 。
? 字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
即如\[.*?\],就可以将[google]和[test]分开。那么,匹配所有内容用的表达式如下:
reg: \[(.*?)\]\((https.*?)\)
replace: <a href="$2">$1</a>
标签:第一个字符 分类 字段 元字符 怎么 空格 this 数字 对象
原文地址:https://www.cnblogs.com/leosyn1998/p/12565551.html