3
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 和最后一个标记中看到的空字符串,我无法理解为什么会出现这种结果,我给定的字符串中没有空字符串。

我不希望这是结果

4

2 回答 2

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);
        }

在此处输入图像描述

于 2012-04-08T19:26:48.590 回答
2

发生这种情况是因为“IF”和“(”是分隔符,并且由于“IF”左侧没有任何内容,“IF”和“(”之间没有任何内容,因此您会得到这两个空条目。从模式中删除“IF”。

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

更新

您可以搜索标记而不是拆分字符串

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

这将准确返回您的文本标记。

string[] array = matches.Cast<Match>().Select(m => m.Value).ToArray();
    [0]:“如果”
    [1]:“(”
    [2]:“总和”
    [3]:“(”
    [4]:“国税局5555”
    [5]:“。”
    [6]:“IRs001”
    [7]:“)”
    [8]:“==”
    [9]:“国税局5555”
    [10]:“。”
    [11]:“国税局001”
    [12]:“,”
    [13]:“10”
    [14]:“,”
    [15]:“20”
    [16]:“)”

更新

Regex您可以尝试的另一种模式Regex.Split

@"\b"

它将在单词边界处拆分文本

    [0]:“”
    [1]:“如果”
    [2]:“(”
    [3]:“总和”
    [4]:“(”
    [5]:“国税局5555”
    [6]:“。”
    [7]:“IRs001”
    [8]:“)==”
    [9]:“国税局5555”
    [10]:“。”
    [11]:“国税局001”
    [12]:“,”
    [13]:“10”
    [14]:“,”
    [15]:“20”
    [16]:“)”
于 2012-04-08T19:33:49.620 回答