title: 正则表达式的一些理解,?问号的用法 逻辑非的表达==
url: 'https://yayi.site/archives/正则表达式的一些理解问号的用法逻辑非的表达'
categories: java
cover: 'https://cdn.jsdelivr.net/gh/TangxinGH/picbed/img/动漫/結城友奈は勇者である/東郷·美森.png'
tags: '正则表达式,学习正则理解增加,java'
abbrlink: 9641a9b7
date: 2020-05-25 22:27:37

updated: 2021-05-14 22:05:05

### $1

正则表达式的部分替换
比如要替换字符串“我是程序员呀”里面的“程序员”,替换为“工程师”。直接模式匹配是可以的,但是如果更加复杂就难了。
使用正则可以做到。


原始字符串:我是程序员呀
正则:(.)(程序员)(.)
替换为:$1工程师$3

如上即可,其中$1和$3分别代表第1个和第3个括号内匹配到的内容。

.号是所有,*是前面的表达式一个或多个

还是视频学习比较好

https://www.cnblogs.com/hjbky/p/9512022.html

行的开始和结束 开始符号: 结束符号:$ 如:cat 应该理解为以c作为一行的第一个字符,紧接着是a,然后是t
例如:String str = “catabdcatdetfcat”
cat : 验证该行以c开头紧接着是a,然后是t
cat$ : 验证该行以t结尾倒数第二个字符为a倒数第三个字符为c
cat$: 以c开头接着是a->t然后是行结束:只有cat三个字母的数据行
$ : 开头之后马上结束:空白行,不包括任何字符
: 行的开头,可以匹配任何行,因为每个行都有行开头

()是组,所以|或逻辑要写在 ( | )里面

正则表达式也是有风格的。

perl风格


# 表达式 #i

是分隔符,#号里面是一个正则表达式,i是==修饰符==,表示不区分大小写。修饰的是表达式,对表达式的一种说明。


x|y 这里的|表示一种或关系,左右是一个==整体== ,如 zoo|food 匹配zoo 这个单词或者food这个单词。一个==整体==

[xyz] 表示一个==集合,并且是或(不能与)的关系== 指的是 x,或者y ,或者z

如何 把 xb|yz 放到 [ ] 里面会怎么样?[xb|yz] 表示 xb 或者yz 还是四个字母?

| 表示 一种分支?

[a-z] 指一个==范围==的集合, 或关系。


正则表达式是由==普通字符(a~z)==和==元字符(代表含义,特殊字符)==组成的。

\B \D之类转义的是正则表达式的==扩充语法==



扩展知识:
逻辑非 可以用零向负宽表达。
?问号跟在表达式后面表示 ,匹配多次0-n。但跟在==其他限制符==后面时,表示非贪婪的。

(pattern)是获取与储存匹配到的结果。但前面跟?:时
(?:pattern)时表示不储存结果 。有什么用呢,比如:industr(?:y|ies) 比industry|industries 更简洁

(?=pattern)正向预查:在任何匹配pattern的字符串处开始匹配查找字符串。这是==一个非获取匹配==,就是说,不需要获取供以后使用。
有什么用呢?比如 window(?=95|7|10) 能匹配到window10中的window,注意此时10是 不匹配的。但是不能匹配window3中的window。==预查不消耗字符==,就是一个匹配后,在最后一次匹配之后立即开始,而不是从包含预查的字符之后开始。

(?!pattern)。负向预查。在任何不匹配pattern的字符串开始处匹配查找字符串,这是一个非获取匹配。比如:window3.1 可以匹配window,而不能匹配window10。预查不消耗字符。
有什么用?
可以用于==逻辑非的表达==

逻辑或 x|y 。z|food 表示 z或者food。与括号组合:(z|f)ood 表示 zood 或者food
[xyz] 则表示字符集合。与| 结合:[x|y|z] 这是什么?
[xyy]这是负值字符集合,匹配未包含的任意字符。(注意 放外面与外面 是不一样的哦。外面 ^[xx]表示 开头加xx )是否也可用于==逻辑非==的表达呢?
[a-z] 。-表示字符范围。

注意:以上是perl兼容的正则风格。实际上。其它语言的正则是不一样的。比如,js,java,python都有自己的风格。

perl 除了上面由==普通字符和元字符==组成的正则表达式之外 ,还有扩充语法:
如\D \W 之类 转义的就是扩充语法。