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

为什么不是';这个正则表达式是否工作:find./-regex'*\(m\| h\)$,regex,macos,Regex,Macos,为什么这个正则表达式不起作用 find ./ -regex '.*\(m\|h\)$ 我注意到以下方法很好: find ./ -regex '.*\(m\)$' 但是,当我通过添加\\124; h来添加“或在文件名末尾添加一个h”时,它不起作用。也就是说,它应该拾取我所有的*.m和*.h文件,但我什么也没有得到 我在Mac OS X上。在Mac OS X上,您不能在基本正则表达式中使用\\,这是find默认使用的 [基本]正则表达式在几个方面有所不同是一个普通字符,其功能没有等价物

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

  find ./ -regex '.*\(m\|h\)$
我注意到以下方法很好:

  find ./ -regex '.*\(m\)$'
但是,当我通过添加
\\124; h
来添加“或在文件名末尾添加一个h”时,它不起作用。也就是说,它应该拾取我所有的
*.m
*.h
文件,但我什么也没有得到


我在Mac OS X上。

在Mac OS X上,您不能在基本正则表达式中使用
\\
,这是
find
默认使用的

[基本]正则表达式在几个方面有所不同是一个普通字符,其功能没有等价物

在这种情况下,最简单的修复方法是将
\(m\|h\)
更改为
[mh]
,例如

find ./ -regex '.*[mh]$'
或者您可以添加
-E
选项,告诉find使用扩展正则表达式

find -E ./ -regex '.*(m|h)$'
不幸的是,
-E
不可移植

还要注意,如果您只想列出以
.m
.h
结尾的文件,则必须转义圆点,例如

find ./ -regex '.*\.[mh]$'
如果您觉得这让人困惑(我也是),那么有一个很好的参考表可以显示哪些系统支持哪些功能


[]

更有效的解决方案是使用
-o
标志:

find . -type f \( -name "*.m" -o -name "*.h" \)
但如果您想使用正则表达式,请使用:

find . -type f -regex ".*\.[mh]$"
你怎么了

find . -name '*.[mh]' -type f

如果您想要奇特的模式,那么使用find2perl并破解该模式。

好的,这有点破解,但是如果您不想在OSX上争论find的正则表达式限制,您可以将find的输出通过管道传输到grep:

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

除非
find
使用了不同风格的正则表达式,否则原始的
\(m\|h\)
是按字面意思匹配的
(m\|h)
,而不是“m”或“h”。当你在解决这个问题时,似乎你只是提供了一种解决方法,而你没有说明原因。不,根据,Mac OS/Darwin/BSD find默认使用基本正则表达式。@Mikel Right…所以问题中的正则表达式不起作用的原因是因为它在转义字符。阅读理解与阅读速度成反比@科雷沃德:是和否。它实际上是在尝试从字面上匹配
m\|h
。在Mac OS X上,支持
\(
\)
,但
\
不支持。@Mikel:是的,我知道这是一个旧线程。我想我应该提到
-E
应该在path变量之前。例如,第一个示例中的
find-E./-regex.*(m | h)$”
-f类型
由于优先级原因,仅应用于
-name“*.h”
(而不是
-name“*.m”
)。修正了。@Mikel谢谢,我没想到。你为什么需要那种奇怪的
\(…\)
。如果您链接
-name-o-name…
只需使用
查找即可-名称'*.[mh]'-类型f