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和最后一个标记中看到的空字符串,我无法理解为什么会出现这种结果,我的给定字符串中没有空字符串。
我不希望这是结果
答案 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);
}
答案 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]: ")"