假设我有下表(称为文件表)和文件名:
file
something.h
something.cc
somethingelse.js
something.py
something.xkh
something.jpeg
我尝试了以下查询:
select file
from filetable
where file ~ E'\.[cc|h|js|py]';
查询输出为:
file
something.h
something.cc
somethingelse.js
something.py
something.xkh
something.jpeg
但是,我只需要完全以 .cc 、 .h 、 .js 、 .py 结尾的文件。 如何改进这个查询?
最佳答案
这个正则表达式:
\.[cc|h|js|py]
并没有按照您的想法行事。 []
是一个字符类,所以 [cc|h|js|py]
匹配字符 'c'
, 'h'
, 'j'
, 'p'
, 's'
, 'y '
和 '|'
而不是您要匹配的四个扩展名。如果您想匹配这四个扩展名,那么您需要使用括号来对您的替换进行分组:
\.(cc|h|js|py)
您也没有锚定您的正则表达式,因此它会在您不希望它匹配时匹配 'pancakes.html'
。您可以通过添加 $
将模式锚定到字符串的末尾来解决此问题:
\.(cc|h|js|py)$
并且您的字符串不包含任何 C 风格的转义序列(例如 \n
),因此您不需要 E
前缀:
where file ~ '\.(cc|h|js|py)$'
关于regex - 字符串末尾的模式匹配(postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25874953/