2 回答
TA贡献2012条经验 获得超12个赞
模组更新
我不确定您为什么选择 Stringnuts 正则表达式,因为它匹配
大括号内的任何内容{}。
对SO的温顺不会得到深入知识的满足,
所以这可能是你真正的问题。
让我们分析您的正则表达式。
{thing:
(?:
( # (1 start)
( \w ) # (2)
\2*
) # (1 end)
( [^}]*? ) # (3)
)+
}
这减少到这个
{thing:
(?: \w [^}]*? )+
}
唯一的限制是,紧跟其后{thing:必须有一个词。
之后可以有其他任何东西,因为这个子句[^}]*?接受
任何东西。
此外,即使该子句不贪婪,周围的集群也只会运行一次迭代(?: )+
所以,基本上,除了单字要求之外,它几乎什么都不做。
您正则表达式可以用于as is获得令人费解的比赛,
因为你已经抓住了所有的部分捕获集合,
以每场比赛,你可以拼凑一起使用下面的代码。
在您继续学习其他东西之前,我会尝试更好地理解正则表达式,因为它可能比
用于提取数据的语言技巧重要得多。
以下是使用未更改的正则表达式将所有内容拼凑在一起的方法。
Regex regex = new Regex(@"{thing:(?:((\w)\2*)([^}]*?))+}");
string str = "stuff/{thing:aa/bb/cccc}{thing:cccc}";
foreach (Match match in regex.Matches(str))
{
CaptureCollection cc1 = match.Groups[1].Captures;
CaptureCollection cc3 = match.Groups[3].Captures;
string token = "";
for (int i = 0; i < cc1.Count; i++)
token += cc1[i].Value + cc3[i].Value;
Console.WriteLine("{0}", token);
}
输出
aa/bb/cccc
cccc
请注意,例如,
只要第一个字符是单词,您的正则表达式将匹配大括号内的几乎所有内容。
例如,它匹配 {thing:Z,,,*()(((asgassgasg,asgfasgafg\/\=99.239 }
您可能需要考虑
大括号内实际允许的要求。
祝你好运!
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报