我有一个名为“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}
(出现范围)和+
( egrep
only) 本身什么都不是。它们总是引用前一个字符/原子 - 无论这是一个实际字符(例如L
或5
),.
(小丑)可以代表任何字符,一系列字符(例如[a-f]
)或多个字符的模式(仅限egrep;例如(abba)
- 其中“abba”被视为一个单位)。因此,*
和?
本身并不代表任何东西,而是告诉我们前一个角色(对于任何一个或一组被视为一个单位的人来说可能是一个小丑)应该重复多少次。
一旦您记住了 shell 和正则表达式使用*
和 的方式之间的区别?
,它就应该明白了。
所以对于正则表达式:
.
- 准确地表示任意字符的一次出现a..a
- 匹配两个 a 和其间任意类型的两个字符.*
- 匹配任何字符出现 0 次、1 次或多次B*
- 匹配 0、1 或多次出现的“B”