正则表达式 (.*) .* 就是这2种写法,有什么却别?分别代表什么含义?

2024年12月04日 17:54
有4个网友回答
网友(1):

把正则表达式的一部分放在圆括号内,你可以将它们形成“组”,表达式的处理引擎会把括号内的处理结果记下来,并给他编号(分别为\1,\2...)。然后你可以对这个结果(即“组”)使用一些正则操作,例如重复操作符。

事实上,当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“\数字”的方式进行引用。<<\1>>引用第一个匹配的后向引用组,<<\2>>引用第二个组,以此类推,<<\n>>引用第n个组。而<<\0>>则引用整个被匹配的正则表达式本身。
可能有点抽象,我们看一个例子。

假设你想匹配一个HTML标签的开始标签和结束标签,以及标签中间的文本。比如This is a test,我们要匹配以及中间的文字。我们可以用如下正则表达式:“<([A-Z][A-Z0-9]*)[^>]*>.*?

首先,“<”将会匹配“”的第一个字符“<”。然后[A-Z]匹配B,[A-Z0-9]*将会匹配0到多次字母数字,后面紧接着0到多个非“>”的字符。最后正则表达式的“>”将会匹配“”的“>”。接下来正则引擎将对结束标签之前的字符进行惰性匹配,直到遇到一个“

你可以对相同的后向引用组进行多次引用,<<([a-c])x\1x\1>>将匹配“axaxa”、“bxbxb”以及“cxcxc”。如果用数字形式引用的组没有有效的匹配,则引用到的内容简单的为空。

一个后向引用不能用于它自身。<<([abc]\1)>>是错误的。因此你不能将<<\0>>用于一个正则表达式匹配本身,它只能用于替换操作中。

后向引用不能用于字符集内部。<<(a)[\1b]>>中的<<\1>>并不表示后向引用。在字符集内部,<<\1>>可以被解释为八进制形式的转码。

向后引用会降低引擎的速度,因为它需要存储匹配的组。如果你不需要向后引用,你可以告诉引擎对某个组不存储。例如:<>。其中“(”后面紧跟的“?:”会告诉引擎对于组(Value),不存储匹配的值以供后向引用。

网友(2):

前者捕获括号里的内容 后者不捕获。如果能达到同样的效果建议后者,效率稍高。
正则里尽量少写. 比如用[^>]之类的代替点号
如果知道字符串长度范围 比如 捕获微博内容 部分就用 [^>]{0,160}

总之,尽可能减少回溯次数。

网友(3):

.* 代表的是通配符
外边有括号的和不写括号区别在于括号的用法
在正则表达式中 ()表示模式单元
当()的正则式匹配时 可以通过调用模式单元的方法调用匹配的内容
用//1 这种格式 调用

网友(4):

(.*) 可以在后面引用或取值 group(1) 取值或\1引用