正则表达式中 .* 的明确含义

正则表达式中 .* 的明确含义

.表示匹配正则表达式中的任何字符。 *表示前面的单个正则表达式出现零次或多次。我的alphabet.txt包含一行

abcdefghijklmnopqrstuvwxyz

并不grep a.*z alphabet.txt意味着匹配以 开头a、中间有零个或多个任何类型的单个字符、并且以z? 结尾的任何子字符串。例如,abzabbzahhhhhz,但不匹配abbdz?

我以为grep a.*z alphabet.txt我的字母文件中不会出现这一行。

答案1

*表示重复紧接在前的模式,而不是重复匹配的文本。例如,[ab]*表示(|[ab]|[ab][ab]|[ab][ab][ab]|…)模式[ab]重复零次或多次。它将匹配,"aba"因为这完全满足模式[ab][ab][ab]

有了.*,它就变成(|.|..|...|....|…),因此它可以匹配任意数量的字符,并且字符可以不同。

答案2

在中abbdz,仅仅因为首先.匹配并不意味着只会匹配表达式的其余部分。b.b

答案3

重复修饰符,例如*作用于前一个正则表达式原子,不是匹配的字符的重复前面的正则表达式原子。例如:

$ printf 'az\nabz\nabbz\nabbbz\nabcz\n' | sed -n '/a.*z/p'
az
abz
abbz
abbbz
abcz

(所有行都匹配)。如果您只想匹配匹配字符,您可以使用反向引用:

$ printf 'az\nabz\nabbz\nabbbz\nabcz\n' | sed -n '/a\(.\)\1*z/p'
abz
abbz
abbbz

答案4

grep a.*z匹配第一次出现 a 和最后一次出现 z 之间的所有内容,包括第一个 a 和最后一个 z。 是.*一个通配符表达式,可匹配任何字符序列,包括长度为 0 的空序列。grep a.*z匹配以下所有以 a 开头并以 z 结尾的字符串:“abcdefghijklmnopqrstuvwxyz”、“abz”、“abbz”、“ahhhhhz”和“abbdz”。 它还匹配跨多行的文本,例如此文本:

abcdefghijklmnopqrstuvwxyz
abz
abbz
ahhhhhz
abbdz

相关内容