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」と「(」の間に何もないため、これら2つの空のエントリを取得するためです。パターンから「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一緒に試すことができるもう1つのパターン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]: ")"
于 2012-04-08T19:33:49.620 に答える