你好,
我无法理解 Unix 终端下正则表达式中句点 (.) 运算符的完整功能。
它说它匹配任何单个字符。当我给grep ‘ct’ a.txt,它返回诸如 cat、cbt、cmt 等结果。它是否也应该打印任何其他类型的数据?因为我不清楚这个周期运算符的基础知识。
如果我给grep ‘c[abm].t’ a.txt,它没有给出预期的结果,即我认为它应该只打印 cat 或 cbt 或 cmt,但它只打印 caat,这是数据之一。请澄清。
此外,如果有任何教程可以帮助我掌握正则表达式的技能,请分享。非常感谢。请尝试解决我的问题。
谢谢。
答案1
句点运算符匹配任意字符一次,且仅匹配一次。因此,在第一个示例中,它匹配 ac 后跟一个字符,该字符后跟一个 t。
在第二个示例中,您的模式被要求匹配 4 个字符,且恰好 4 个字符。它们是:
C
其次是
[abm] - 以下任何一个
其次是
. - 任意单个字符
其次是
吨
至于学习正则表达式,请查看此处:https://stackoverflow.com/questions/4736/learning-regular-expressions
答案2
在您的示例中,grep 'c[abm].t' a.txt 将输出 a.txt 中包含至少四个您指定的字符的任何行。'c'、'a'、'b' 或 'm'、'任何字符',然后是 't'。
'c[abm].t' 将匹配:
cart
caat
ca%t
caNt
cm_t
moo cbqt this whole line is returned because it contains a match
rocbtt
等等等等。
希望这有助于您理解您的示例。
正则表达式可能非常复杂。除了我现在第一次发现和查看的内容之外,我无法随意推荐任何其他内容。
请注意,有许多不同的风格和实现,从 grep(和 egrep / grep -E)到 perl 到 php 到 Javascript 等等。
在玩这些工具时,你会发现自己必须记住正确地从 shell 中转义某些内容,并从正则表达式本身中删除其他内容……如果要匹配文字“.”(句点),则需要使用 grep 来'moo\.'
匹配“moo.”而不是“moof”
O'Reilly 出版的《精通正则表达式》一书被认为相当权威。
答案3
句点运算符可匹配任何字符,正如描述中所述。因此,“ct”将匹配“cat”、“cbt”、“cct”...“czt”、“c1t”...等。
在您的第二个示例中,结果正如预期的那样。[abm] 匹配任何字符 a、b 或 m。紧接着,句点运算符匹配任何字符。因此,该表达式仅查找四个字母的字符串。
我发现学习正则表达式的最佳资源是掌握正则表达式来自 O'Reilly Media。它不仅涵盖了大量的正则表达式方言,而且还深入介绍了引擎如何进行实际处理。如果您要定期使用正则表达式(双关语),那么这是一个非常宝贵的资源。