0

是的,我正在寻找一个正则表达式,它将转换以下输入:

[[stateless society|stateless societies]]

进入这个输出:

stateless societies

更改此输入时:

[[political philosophy]] 

进入这个输出:

political philosophy

基本上我正在使用一个 xml 文件并试图从中获取纯文本。我实际上已经设法获得了一个选择两个选项中的第一个(或只是第一个选项)的正则表达式:

\|([^\]]*)\]\]|\[\[|\]\]

但我似乎无法在双方括号之间选择最后一个选项。我想使用替换而不是匹配来做到这一点,因为我还需要删除一堆其他东西。

PS如果有人能想出一个更合适的标题,请帮我编辑。

4

2 回答 2

1

这是我想出的(凌乱的)正则表达式:

\[\[([^\]\[\|]*\|)*(?<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
于 2013-08-21T16:23:26.027 回答
0

这应该可以解决问题/(^(\[+))|[\|]|[\]+]/g http://jsfiddle.net/vmYDW/5/

于 2013-08-21T16:06:24.443 回答