Regex.Split白色空间

时间:2012-04-08 19:20:08

标签: c#

string pattern = @"(if)|(\()|(\))|(\,)";
string str = "IF(SUM(IRS5555.IRs001)==IRS5555.IRS001,10,20)";
string[] substrings = Regex.Split(str,pattern,RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase) ;
foreach (string match in substrings)
{
    Console.WriteLine("Token is:{0}", match);
}

而且输出是

Token is:
Token is:IF
Token is:
Token is:(
Token is:SUM
Token is:(
Token is:IRS5555.IRs001
Token is:)
Token is:==IRS5555.IRS001
Token is:,
Token is:10
Token is:,
Token is:20
Token is:)
Token is:

正如你在1,3和最后一个标记中看到的空字符串,我无法理解为什么会出现这种结果,我的给定字符串中没有空字符串。

我不希望这是结果

2 个答案:

答案 0 :(得分:4)

试试:

        string pattern = @"(if)|(\()|(\))|(\,)";
        string str = "IF(SUM(IRS5555.IRs001)==IRS5555.IRS001,10,20)";
        var substrings = Regex.Split(str, pattern, RegexOptions.IgnoreCase).Where(n => !string.IsNullOrEmpty(n));
        foreach (string match in substrings)
        {
            Console.WriteLine("Token is:{0}", match);
        }

enter image description here

答案 1 :(得分:2)

这是因为“IF”和“(”是分隔符,因为“IF”左边没有任何内容,“IF”和“(”之间没有任何内容可以获得这两个空条目。从中删除“IF”图案。

string pattern = @"(\()|(\))|(\,)"; 

更新

您可以搜索令牌而不是拆分字符串

var matches = Regex.Matches(str, @"\w+|[().,]|==");

这会立即返回文本的标记。

string[] array = matches.Cast<Match>().Select(m => m.Value).ToArray();
    [0]: "IF"
    [1]: "("
    [2]: "SUM"
    [3]: "("
    [4]: "IRS5555"
    [5]: "."
    [6]: "IRs001"
    [7]: ")"
    [8]: "=="
    [9]: "IRS5555"
    [10]: "."
    [11]: "IRS001"
    [12]: ","
    [13]: "10"
    [14]: ","
    [15]: "20"
    [16]: ")"

更新

您可以与Regex一起尝试的另一个Regex.Split模式是

@"\b"

它会将文字拆分为单词边界

    [0]: ""
    [1]: "IF"
    [2]: "("
    [3]: "SUM"
    [4]: "("
    [5]: "IRS5555"
    [6]: "."
    [7]: "IRs001"
    [8]: ")=="
    [9]: "IRS5555"
    [10]: "."
    [11]: "IRS001"
    [12]: ","
    [13]: "10"
    [14]: ","
    [15]: "20"
    [16]: ")"