gpt4 book ai didi

c++ - IRC channel 正则表达式组合

转载 作者:行者123 更新时间:2023-11-28 05:47:59 25 4
gpt4 key购买 nike

我在为 irc channel 编写正则表达式字符串时遇到问题

// digit      =  %x30-39                 ; 0-9
static const std::string digit("(?:[\x30-\x39])");
// channelid = 5( %x41-5A / digit ) ; 5( A-Z / 0-9 )
static const std::string channelid("(?:(?:[\x41-\x5A]|" + digit + "){5})");
// chanstring = %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B / %x2D - 39 / %x3B - FF
static const std::string chanstring("(?:[\x01-\x07\x08-\x09\x0B-\x0C\x0E-\x1F\x21-\x2B\x2D-\x39\x3B-\xFF])");
// channel = ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring [":" chanstring]
static const std::string channel("(?:(?:[#+&]|(?:!" + channelid + "))" + chanstring + "(?::" + chanstring + ")?)");

我确定 digit 和 channelid 的格式正确。

const std::regex digit(dapps::regex::digit);
assert(std::regex_match("0", digit));
assert(std::regex_match("1", digit));
assert(std::regex_match("2", digit));
assert(std::regex_match("3", digit));
assert(std::regex_match("4", digit));
assert(std::regex_match("5", digit));
assert(std::regex_match("6", digit));
assert(std::regex_match("7", digit));
assert(std::regex_match("8", digit));
assert(std::regex_match("9", digit));
assert(!std::regex_match("10", digit));

const std::regex channelid(dapps::regex::channelid);
assert(std::regex_match("ABCDE", channelid));
assert(std::regex_match("12345", channelid));

而且我很确定 chanstring 的格式也正确,为什么这行不通?

const std::regex channel(dapps::regex:: channel);
assert(std::regex_match("#channelname", channel));

最佳答案

问题是 chanstring 只匹配长度为 1 的字符串。它本质上是正则表达式 [^\x00\x07\x0d\x0a ,:],它需要一个{N}*+ 以匹配超过 1 个字符。

不幸的是,这似乎不仅仅是您代码中的问题。 RFC 2812's ABNF将语法定义为(修剪未使用的语法):

channel    =  ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring
[ ":" chanstring ]
chanstring = %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B
chanstring =/ %x2D-39 / %x3B-FF
; any octet except NUL, BELL, CR, LF, " ", "," and ":"
channelid = 5( %x41-5A / digit ) ; 5( A-Z / 0-9 )

该语法定义使 chanstring 仅匹配长度为 1 的字符串。他们可能应该将 chanstring 定义为 1*44(...),或类似的东西。

要解决此问题,您要么必须创建一个笨拙的正则表达式(例如 like this),要么手动检查 channel 的长度以确保它不超过有效限制(50,如你说)在用正则表达式验证它之前。

关于c++ - IRC channel 正则表达式组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35837263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com