无法在 C 中形成所需的正则表达式

Unable to form the required regex in C

我正在尝试编写一个可以搜索字符串的正则表达式,return如果它与正则表达式匹配则为真,否则为假。

检查应确保字符串是网站的通配符域名。

示例:

所以我写了这样的东西

\*\.[.*]\.[.*]

但是,这也允许 *.. 字符串作为有效字符串,因为 * 表示出现 0 次或无限次。

我正在寻找确保字符串至少出现 1 次的东西。

示例: *.a.b -> 有效但 *.. -> 无效

如何更改正则表达式以支持此功能?

我已经试过这样做了:

\*\.([.*]{1,})\.([.*]{1,}) -> doesnt work

\*\.([.+])\.(.+) -> doesnt work

^\*\.[a-zA-Z]+\.[a-zA-Z]+ -> doesnt work

我也尝试了很多其他选项,但都没有找到解决方案。如果有人可以提供一些意见,那就太好了。

PS。寻找适用于 C 的解决方案。

[.*] 并不意味着任何东西“出现 0 次或多次”。它的意思是“单个字符,一个(文字). 或一个(文字)[*]”。 […] 定义了一个 字符 class,它正好匹配指定集中的一个字符。括号甚至与括号完全不同。

所以如果你想表达“零个或多个除换行符外的任何字符”,你可以只写.*。这就是 .* 的意思。如果你想要“一个或多个”而不是“零个或多个”,你可以将 * 更改为加号, 只要你记得 regex.h 正则表达式应该 总是REG_EXTENDED 标志一起编译。没有那个标志,+ 只是一个普通字符。 (还有很多其他的不便。)

但这可能不是您真正想要的。我猜你想要这样的东西:

^[*]([.][A-Za-z0-9_]+){2,}$

尽管您必须更正字符 class 以指定您认为合法的精确字符集。

再次强调,调用 regcomp 时不要忘记关键的 REG_EXTENDED 标志。

一些注意事项:

  • {2,}* 之后至少需要两个组件,这样 *.cool 就不会匹配。

  • 正则表达式开头和结尾的 ^$ 将匹配“锚定”到整个输入。这会停止匹配输入的一部分的模式,但它可能也不是您想要的。

  • 最后我特意用一个single-character字符class强制[*][.]为普通字符。我发现它比落木 (\) 更具可读性,而且它避免了考虑字符串转义和 regex-escaping.

    的组合

有关更多信息,我强烈建议阅读 man regcomp and man 7 regex。对正则表达式的一个很好的介绍也可能有用。