如何使用 regexp 在 C/C++ 中执行 glob (Linux)
我需要匹配一些简单的仅包含 * 和 ? 的简单全局模式。我想到我可以将输入模式转换为正则表达式 - 唯一的问题是我对正则表达式不够熟悉,无法知道替换。
本质上,我需要一个实现:
std::string getRexExpForGlob(const std::string& globPattern);
请注意,这些匹配不用于与文件系统有关的任何事情,因此 POSIX glob 不会这样做。
I need to match simple some simple glob patterns that include only * and ?. It occurred to me that I could transform the input pattern into a regexp - the only problem is I'm not familiar with regexp enough to know the replacements.
Essentially, I need an implementation for:
std::string getRexExpForGlob(const std::string& globPattern);
Note these matches aren't used for anything to do with the filesystem, so POSIX glob won't do.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
根据您的操作系统,您可能有
和int fnmatch(const char* pattern, const char* string, int flags)
。这允许针对任意字符串的全局模式,以及一些额外的标志以允许超出文件名匹配所需的灵活性。否则,glob 的
*
和?
分别相当于 regexp.*
和.
。 (Globs 也可以有 [] 替代品,但你说过你的没有)。Depending on your OS, you may have
<fnmatch>
withint fnmatch(const char* pattern, const char* string, int flags)
. This allows glob patterns against arbitrary strings, and a few extra flags to allow flexibility beyond that needed for filename matching.Otherwise, glob's
*
and?
are equivalent to regexp.*
and.
respectively. (Globs can also have [] alternatives but you've said yours don't).glob 模式中的
*
相当于正则表达式中的.*
。?
相当于.
。在大多数正则表达式方言中,.
默认情况下不匹配换行符,因此如果您需要它匹配该字符,请检查您的库以了解如何设置该标志。*
in a glob pattern is equivalent to.*
in regex.?
is equivalent to.
. In most regex dialects,.
does not match a newline by default, and so if you need it to match that character, check your library for how to set that flag.在正则表达式中,
.
表示任何单个字符。这映射到 glob 模式中的?
。同样,.*
表示任何字符序列,它映射到全局模式中的*
。您应该能够从中编写一个可行的函数。In regular expressions,
.
represents any single character. This maps to?
in glob patterns. Similarly,.*
represents any sequence of characters, which maps to*
in glob patterns. You should be able to write a workable function from that.字符串是否替换为:
? -> .
*-> .*
。 -> \.
这在大多数情况下都可以。
如果您在文本中遇到一些特殊字符并且在正则表达式中具有特殊含义,请添加更多内容,例如底行。
Do a string replace with:
? -> .
* -> .*
. -> \.
This will do in most cases.
If you come accross some special characters which can be in your text and have special meaning in regex, add more like the bottom line.