这是我想出的(凌乱的)正则表达式:
\[\[([^\]\[\|]*\|)*(?<foo>[^\[\]\|]+)\]\]
使用此正则表达式,您可以将输入替换为捕获的标有“foo”的子字符串。
在 C# 中,我编写了以下代码段:
String pattern = @"\[\[([^\]\[\|]*\|)*(?<foo>[^\[\]\|]+)\]\]";
String input = @"[[stateless society|stateless societies]]";
String input2 = @"[[political philosophy]]";
Regex reg = new Regex(pattern);
System.Console.WriteLine(reg.Replace(input, reg.Match(input).Groups["foo"].Captures[0].Value));
System.Console.WriteLine(reg.Replace(input2, reg.Match(input2).Groups["foo"].Captures[0].Value));
并收到此输出:
stateless societies
political philosophy
但是请注意,如果输入字符串与捕获组“foo”不匹配,则会出现 index-out-of-range 异常Captures[0]
。您应该先检查是否有匹配项。
类似的代码应该能够在 VB.Net 中编写,因为 Regex 类可用于 C# 和 VB.Net。
编辑:根据评论中的要求,我进行了修改,以将两个输入的输出作为一个字符串的一部分。它不会在一次操作中完成所有操作,但代码使用了一个简单的循环。子字符串“randomgarbage”只是为了表明匹配之间可以有文本,它应该仍然可以正常工作。
String pattern = @"\[\[([^\]\[\|]*\|)*(?<foo>[^\[\]\|]+)\]\]";
String input = @"[[stateless society|stateless societies]]randomgarbage[[political philosophy]]";
Regex reg = new Regex(pattern);
foreach(Match match in reg.Matches(input))
{
System.Console.WriteLine(match.Groups["foo"].Captures[0].Value);
}
编辑 2:添加一些代码来演示如何获取括号输入和括号节点之间的文本。
请注意,正则表达式发生了变化;我添加了“bar”捕获组来识别括号节点之间的文本。由于括号被用作输入的语法,我已将它们从一般文本中排除。此外,这应该按照它们在文本中出现的顺序处理捕获。
String pattern = @"(\[\[([^\]\[\|]*\|)*(?<foo>[^\[\]\|]+)\]\])*(?<bar>[^\[\]]*)";
String input = @"[[stateless society|stateless societies]]randomgarbage[[political philosophy]]";
Regex reg = new Regex(pattern);
foreach(Match match in reg.Matches(input))
{
foreach(Capture item in match.Groups["foo"].Captures)
{
System.Console.WriteLine(item.Value);
}
foreach(Capture item in match.Groups["bar"].Captures)
{
System.Console.WriteLine(item.Value);
}
}
生成的输出是:
stateless societies
randomgarbage
political philosophy