为什么这个正则表达式不工作:find ./ -regex '.*\(m\|h\)$'

27 浏览
0 Comments

为什么这个正则表达式不工作:find ./ -regex '.*\(m\|h\)$'

为什么这个正则表达式不起作用?

find ./ -regex '.*\(m\|h\)$

我注意到以下的正则表达式可以正常工作:

find ./ -regex '.*\(m\)$'

但是当我添加了“或者以h结尾的文件名”的条件,即添加了\|h,它就不起作用了。也就是说,它应该匹配所有的*.m*.h文件,但是我没有得到任何结果。

我使用的是Mac OS X操作系统。

0
0 Comments

为什么这个正则表达式不起作用:find ./ -regex '.*\(m\|h\)$'?

在这种情况下,正则表达式 '.*\(m\|h\)$' 未能正常工作的原因可能是 find 命令在OSX上的正则表达式限制。解决方法是通过将 find 的输出管道传递给 grep 命令,来绕过这个问题:

以下是解决方法的代码示例:

find . | grep ".*\(\h\|m\)"

0
0 Comments

为什么这个正则表达式不起作用: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)$"

0
0 Comments

文章标题:为什么这个正则表达式不起作用以及解决方法

正文:

在使用命令行工具`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 ...`的方式进行链接,它也是有效的。

通过以上解决方法,你可以修复这个正则表达式无法工作的问题。希望这篇文章对你有所帮助。

0