正则表达式搜索重叠模式

时间:2010-11-15 23:29:56

标签: regex

这是我的问题的简化版本:

我正在尝试提取所有由非单词字符包围的字母,但是当非字符重叠时,我的正则表达式不起作用。

这是我的代码:

var text = "Z#A#B#S";
var regex = new Regex(@"\W(?<letter>\w)\W");
foreach (var m in regex.Matches(text).Cast<Match>())
{
    Console.WriteLine("Match = {0}", m.Value);
    Console.WriteLine("Letter = {0}", m.Groups["letter"].Value);
    Console.WriteLine("-------------------");
}

我希望它匹配A和B,但它只匹配A.这是输出:

Match = #A#
Letter = A
-------------------

这适用于文字“Z#A ## B#S”(两场比赛之间没有重叠)。

如何从“Z#A#B#S”文本中提取A和B?

由于

2 个答案:

答案 0 :(得分:5)

使用背后的外观和前瞻

        var text = "Z#A#B#S";
        var regex = new Regex(@"(?<=\W)\w(?=\W)");
        foreach (Match m in regex.Matches(text))
        {
            Console.WriteLine("Letter = {0}", m.Value);
            Console.WriteLine("-------------------");
        }

http://www.regular-expressions.info/lookaround.html

答案 1 :(得分:3)

可能你应该使用Lookaround断言:

(?<=\W)(?<letter>\w)(?=\W)

以下列方式匹配:

alt text