正则表达式中.*和*的区别

正则表达式中.*和*的区别

我有一个名为“test”的文件,其中包含

linux
Unixlinux
Linuxunix
it's linux
l...x

现在当我使用时grep '\<l.*x\>',它匹配:

linux
it's linux
l...x

但当我使用时grep '\<l*x\>',它只匹配:

l...x,但根据参考指南,当使用 * 时,前面的项目将匹配零次或多次,即它应该匹配以 'l' 开头并以 'x' 结尾的任何内容

谁能解释为什么它没有显示出预期的结果或者我是否理解错误?

答案1

符号 (.*)

正则表达式 .* 和 * 中的 * 指的是计数,而不是每个字符的字符数,更准确地说,它的意思是“零个或多个”。此外,方法'任何单个字符'

所以当你把它们放在一起时你会得到“零个或多个任意字符”。例如像这样的字符串:

  • Linux的
  • 林恩恩克斯
  • lnx
  • 嗨Linux
  • 勒克斯

将匹配为<l.*x>.最后一项很重要,它表明.*也无法匹配。

符号 (*)

正如我所说,单独使用 * 是一个计数器。所以当你把它放在一个字母后面时,例如'l'* 是说'零个或多个 l'

请注意,如果我们 grep for l*x,这将匹配l...x,但可能不是您想象的那样。

% echo "l...x" | grep "l*x"
l...x

它匹配尾随的“x”。除了“x”前面有“x”之外,“l”与匹配的原因无关'零个或多个 l'

答案2

如果您想匹配以“l”开头并以“x”结尾的任何内容,请尝试正则表达式“l.*x”。这里 ”。” “*”和“*”分别是表示单个有效字符和长度至少为零的字符的特殊字符。这里“*”之前是“.”,所以无论什么都可以代替“.”。根据上面“*”的定义重复。

答案3

对于 shell(例如 bash),当小丑用于匹配文件名时,*?是字符本身 - 它们代表字符。

另一方面,对于正则表达式,*, ?, {n,m}(出现范围)和+( egreponly) 本身什么都不是。它们总是引用前一个字符/原子 - 无论这是一个实际字符(例如L5),.(小丑)可以代表任何字符,一系列字符(例如[a-f])或多个字符的模式(仅限egrep;例如(abba)- 其中“abba”被视为一个单位)。因此,*?本身并不代表任何东西,而是告诉我们前一个角色(对于任何一个或一组被视为一个单位的人来说可能是一个小丑)应该重复多少次。

一旦您记住了 shell 和正则表达式使用*和 的方式之间的区别?,它就应该明白了。

所以对于正则表达式:

  • .- 准确地表示任意字符的一次出现
  • a..a- 匹配两个 a 和其间任意类型的两个字符
  • .*- 匹配任何字符出现 0 次、1 次或多次
  • B*- 匹配 0、1 或多次出现的“B”

相关内容