为什么这个正则表达式不工作:find ./ -regex '.*\(m\|h\)$'
为什么这个正则表达式不起作用:find ./ -regex '.*\(m\|h\)$')?
在Mac OS X上,你不能在基本正则表达式中使用\|,而find默认使用的正则表达式就是基本正则表达式。
最简单的解决方法是将\(m\|h\)改为[mh],例如:
find ./ -regex '.*[mh]$'
或者可以添加-E选项,告诉find使用扩展正则表达式,例如:
find -E ./ -regex '.*(m|h)$'
不幸的是,-E选项不是可移植的。
还要注意,如果你只想列出以.m或.h结尾的文件,你必须转义点,例如:
find ./ -regex '.*\.[mh]$'
如果你觉得这很困惑(我也是),有一个很好的参考表格,显示了哪些功能在哪些系统上受支持。
除非find使用不同的正则表达式风格,否则原来的\(m\|h\)会匹配(m|h)字面上的字符,而不是匹配m或h。虽然你解决了这个问题,但似乎并没有解释原因。
不,根据man页,Mac OS/Darwin/BSD的find默认使用的是基本正则表达式。
是的,问题的原因是正则表达式中的字符被转义了。阅读理解与阅读速度成反比。 😉
是的和不是。实际上它尝试匹配字面上的m\|h。在Mac OS X中,\(和\)是支持的,但\|不是。
太复杂了!你不需要正则表达式。通配符就可以正常工作:find . -name '*.[mh]' -type f
是的,我知道这是一个旧的帖子。我想提一下,-E应该放在路径变量之前。例如:find -E ./ -regex ".*(m|h)$"
文章标题:为什么这个正则表达式不起作用以及解决方法
正文:
在使用命令行工具`find`时,有一个正则表达式无法正常工作的问题。具体的命令是`find ./ -regex '.*\(m\|h\)$'`。下面我们将探讨这个问题产生的原因以及解决方法。
首先,我们可以使用更高效的解决方案,即使用`-o`标志。具体命令如下:
find . -type f \( -name "*.m" -o -name "*.h" \)
如果你仍然想使用正则表达式,可以尝试以下命令:
find . -type f -regex ".*\.[mh]$"
问题的原因在于,第一个例子中的`-type f`仅被应用于`-name "*.h"`(而不是`-name "*.m"`),这是由于优先级问题导致的。解决方法是修正优先级。
另外,你可能会问为什么需要奇怪的`\( .. \)`。如果你使用`-name -o -name ...`的方式进行链接,它也是有效的。
通过以上解决方法,你可以修复这个正则表达式无法工作的问题。希望这篇文章对你有所帮助。