直截了当。我正在研究一个IRC机器人,而且我正处于一堵砖墙上,从今天凌晨4点开始,我一直在挣扎着。
我正在尝试在regex组中对IRC Raw 005(IS_SUPPORTED)字符串进行排序。示例字符串如下所示。
Nickname MAXTARGETS=20 WALLCHOPS WATCH=128 WATCHOPTS=A SILENCE=15 MODES=12 CHANTYPES=# PREFIX=(qaohv)~&@%+ CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMTGZ NETWORK=Network CASEMAPPING=ascii EXTBAN=~,qjncrRa ELIST=MNUCT
到目前为止,我已经清理了其余的数据包,所以这一行正是我正在使用的,尽管它可能有我的例子中没有显示的其他字段。我有字符串,这些字符串都可以在此数据包中的每个可能字段之后命名。我希望将每个字符串,整数和bool设置为每个结果信息,按C#中的正则表达式组排序
更清楚,
public int maxtargets
将设置为正则表达式组的结果
<maxtargets>
public bool wallchops
将设置为true,如果
正则表达式组<wallchops>
返回自身。 public string chantypes
将设置为正则表达式组<chantypes>
我无法组装搜索和匹配字段和值的正则表达式搜索字符串,在字段可能不存在的情况下,字段的顺序可能完全不同。
我希望我清楚这一点,并填写我忘记的任何空白。
答案 0 :(得分:0)
在某个字段可能不存在的情况下,字段的顺序可能完全不同。
我认为在上述案例中写一个REGEX不是最佳做法。相反,您可以使用简单的字符串方法来实现目标。
class IrcParser
{
private string input;
public IrcParser(string input)
{
this.input = input;
}
public Irc GetResult()
{
Irc irc = new Irc();
string[] result = input.Split();
for (int i = 0; i < result.Length; i++)
{
string[] FieldValue = result[i].Split('=');
switch (FieldValue[0])
{
case "MAXTARGETS":
irc.maxTargets = Convert.ToInt32(FieldValue[1]);
break;
case "WALLCHOPS":
irc.wallChops = true;
break;
case "CHANTYPES":
irc.chanTypes = FieldValue[1];
break;
}
}
return irc;
}
public Irc GetResultByRegex()
{
Irc irc = new Irc();
MatchMaxTargets(ref irc.maxTargets);
MatchWallChops(ref irc.wallChops);
MatchChanTypes(ref irc.chanTypes);
return irc;
}
private void MatchMaxTargets(ref int maxTargets)
{
Regex regex = new Regex(@"(?<=MAXTARGETS=)(\d+)");
Match m = regex.Match(input);
if (m.Success){
maxTargets = Convert.ToInt32(m.Groups[1].Value);
}
}
private void MatchWallChops(ref bool wallChops)
{
if (Regex.IsMatch(input, "WALLCHOPS"))
{
wallChops = true;
}
}
private void MatchChanTypes(ref string chanTypes)
{
Regex regex = new Regex(@"(?<=CHANTYPES=)(.*?)(?=\s)");
Match m = regex.Match(input);
if (m.Success)
{
chanTypes = m.Groups[1].Value;
}
}
}
class Irc
{
public int maxTargets;
public bool wallChops;
public string chanTypes;
}
更新: 我添加了在各个字段值上执行REGEX匹配的方法。如果我们写一行REGEX,则组结果顺序将根据字段可用性而改变。(在这种情况下,您不能将组值分配给适当的字段。)
希望它对你有所帮助 --SJ
答案 1 :(得分:0)
一位朋友最后帮我解决了这个问题,我们研究了如何成功匹配上面的字符串,天气是否有一个字段,无论它是什么顺序。
(?:(?:SILENCE=(?<silence>\d+)\s?)|(?:MODES=(?<modes>\d+)\s?)|(?:CHANTYPES=(?<chantypes>\S+)\s?)|(?:PREFIX=(?<prefix>\S+)\s?)|(?:MAXTARGETS=(?<maxtargets>\d+)\s?)|(?:WATCH=(?<watch>\d+)\s?)|(?<wallchops>WALLCHOPS)|(?:NETWORK=(?<network>\w+)\s?)|(?:CASEMAPPING=(?<casemapping>\w+)\s?)|(?:CHANMODES=(?<chanmodes>\S+)\s?)|(?:EXTBAN=(?<extban>\S+)\s?)|(?:ELIST=(?<elist>\w+)\s?)|(?:WATCHOPTS=(?<watchopts>\S+)\s?)\s?)
是的,我意识到这是一个巨大的正则表达式搜索字符串,它将按照我想要的方式返回行。我也意识到这不是实践中最好的主意。这个搜索行将增长到庞大的规模,并且可能会产生大量的开销并浪费CPU时间来执行。
SJ, 我非常感谢你的反馈意见,我会把你建议的代码用到这个方面,并且当然会有一些细微的变化。