Regex.Split表现出奇怪的行为

时间:2010-02-26 22:34:16

标签: c# regex

我有一个正则表达式,我正在对另一个字符串进行拆分而且我得到了奇怪的结果。

        string subjectString = "Triage|Follow Up|QA";
        string[] splitArray = null;
        try
        {
            splitArray = System.Text.RegularExpressions.Regex.Split(subjectString, @"(?<=(^|[^\\]))\|");

            foreach (var item in splitArray)
            {
                System.Diagnostics.Debug.Print(item);
            }
        }
        catch
        {
        }

正在打印的项目是:

分流
Ë
跟进
p
质量保证

正则表达式在RegexBuddy中正常运行,但在C#中运行不正常。什么导致奇怪的行为?解释为什么拆分功能按照原样运行的额外要点。

2 个答案:

答案 0 :(得分:5)

您的后视断言中的分组(…)导致此问题。请尝试使用非捕获组:

@"(?<=(?:^|[^\\]))\|"

或根本没有其他分组:

@"(?<=^|[^\\])\|"

答案 1 :(得分:1)

RegexBuddy还没有模仿.NET在Split()返回的数组中包含捕获组匹配的文本的行为。要在.NET中获得与RegexBuddy中相同的行为,请将所有捕获组(...)更改为非捕获组(?:...)或使用RegexOptions.ExplicitCapture将所有未命名组转换为非捕获组

通过在返回的数组中包含捕获组,.NET的Split()函数可以包含正则表达式匹配的分隔符和数组中分隔符之间的文本。使用正则表达式<[^>]+>拆分可以获取HTML标记之间的文本,而不使用HTML标记。使用正则表达式(<[^>]+>)拆分可以获取包含HTML标记的HTML标记之间的文本。 (这些简单的正则表达式假设输入包含有效的HTML而没有任何HTML注释。)