如何使用 regexp 在 C/C++ 中执行 glob (Linux)

发布于 2024-10-01 20:47:43 字数 248 浏览 9 评论 0原文

我需要匹配一些简单的仅包含 * 和 ? 的简单全局模式。我想到我可以将输入模式转换为正则表达式 - 唯一的问题是我对正则表达式不够熟悉,无法知道替换。

本质上,我需要一个实现:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

花开柳相依 2024-10-08 20:47:43

根据您的操作系统,您可能有 int fnmatch(const char* pattern, const char* string, int flags)。这允许针对任意字符串的全局模式,以及一些额外的标志以允许超出文件名匹配所需的灵活性。

否则,glob 的 *? 分别相当于 regexp .*.。 (Globs 也可以有 [] 替代品,但你说过你的没有)。

Depending on your OS, you may have <fnmatch> with int 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).

绅刃 2024-10-08 20:47:43

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.

奢望 2024-10-08 20:47:43

在正则表达式中,. 表示任何单个字符。这映射到 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.

我的鱼塘能养鲲 2024-10-08 20:47:43

字符串是否替换为:

? -> .
*-> .*
。 -> \.

这在大多数情况下都可以。
如果您在文本中遇到一些特殊字符并且在正则表达式中具有特殊含义,请添加更多内容,例如底行。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文