无法在 C 中形成所需的正则表达式
Unable to form the required regex in C
我正在尝试编写一个可以搜索字符串的正则表达式,return如果它与正则表达式匹配则为真,否则为假。
检查应确保字符串是网站的通配符域名。
示例:
*.cool.dude 有效
*.cool 无效
abc.cool.dude 无效
所以我写了这样的东西
\*\.[.*]\.[.*]
但是,这也允许 *.. 字符串作为有效字符串,因为 * 表示出现 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。对正则表达式的一个很好的介绍也可能有用。
我正在尝试编写一个可以搜索字符串的正则表达式,return如果它与正则表达式匹配则为真,否则为假。
检查应确保字符串是网站的通配符域名。
示例:
*.cool.dude 有效
*.cool 无效
abc.cool.dude 无效
所以我写了这样的东西
\*\.[.*]\.[.*]
但是,这也允许 *.. 字符串作为有效字符串,因为 * 表示出现 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。对正则表达式的一个很好的介绍也可能有用。