【问题标题】:Is there a way to apply FNM_PATHNAME flag of fnmatch only for first instance of slash?有没有办法仅将 fnmatch 的 FNM_PATHNAME 标志应用于斜杠的第一个实例?
【发布时间】:2023-11-22 11:52:01
【问题描述】:

您好,我正在尝试使用 fnmatch 和某些规则来执行通配符掩码。

在字符串中找到斜杠“/”的第一个实例时,它必须与模式中的斜杠 ('/') 完全匹配。即通配符 ('*') 将无法匹配。但是,输入字符串中的后续斜杠可以使用通配符进行匹配。

例如想要的结果:

字符串 a/b/c 应该使用 / 匹配。即匹配“b”之后的第二个“/”,但不匹配“a”之后的第一个斜杠。

string: a/b/c pattern: / Result: 匹配。因为 str 中“/”的第一个实例在模式中有一个明确的“/”

string: a/b/c pattern: * Result: 不匹配。因为 str 中“/”的第一个实例没有明确的“/”

我已经使用 fnmatch 尝试了下面的代码部分

int match(char pat[], char str[])
{
   int rVal = fnmatch(pat, str, FNM_PATHNAME);
   return rVal;

}

-> 如果我需要将字符串中的每个“/”映射到模式中的“/”,则使用 FNM_PATHNAME 标志的上述代码成功工作。但如果我需要将其限制为仅一审,则不是。

-> 我可以使用 fnmatch 继续处理这个问题,还是需要依赖任何其他 posix 功能。请帮忙。

【问题讨论】:

  • 不太清楚你想做什么。请添加更多示例。
  • 当然,我已经添加了一些示例。

标签: c++ c glob wildcard-mapping fnmatch


【解决方案1】:

不,没有办法直接使用 fnmatch 执行此操作,但您可以在第一个 / 处将模式一分为二,然后在第一个 / 处同样拆分所有候选字符串,然后分别匹配第一部分和第二部分。

【讨论】: