2016-07-09 10 views
1

数字と演算子を区切って(文字列にかっこや負の数を含まない)文字列のリストに下の文字列を分割する方法を教えてください。数と演算子を分割する正規表現

例:以下は

inputString = 1+2-2.3*4/12.12 
outputList = {1,+,2,-,2.3,*,4,/,12.12} 

私だけの数字を与えるだろう。何の括弧、ない負の数 - - あなただけの文字列を分割するために、単純な\s*([-+/*])\s*正規表現を使用することができますが、入力の構造はかなり単純化されないことを確認以来、私は事業者だけでなく

var digits = Regex.Split(inputString , @"\D+"); 
+0

なぜ '2.3'は' 2.3'として解析されるのですか? 「12.12」 - 「12,12」? – soon

+0

私はそれがタイプミスであると考えました。 – Kinetic

+0

私は入力が常にそうであるとは限らないので、スペースを削除しました。また、入力ミスが修正されました12.12 – Cannon

答えて

2

を必要としています。

捕捉括弧はRegex.Split式で使用される場合、任意の捕捉されたテキストが得られた文字列配列に含まれている:Regex.Splitも全て捕捉サブストリング結果でを出力することが

注意。だから、

、単に結果のリスト/配列から空の要素を削除することを忘れないでください

Regex.Split(input, @"\s*([-+/*])\s*") 
        .Where(n => !string.IsNullOrEmpty(n)) 
        .ToList(); 

を使用しています。

パターンは詳細:

  • \s* - (要素 "トリム")は、ゼロ個以上の空白
  • ([-+/*]) - グループ1捕捉-+/又は*
  • \s* - ゼロ個以上の空白(要素を「トリミングする」)

IDEONE demoを参照してください:

var input = "1+2-2.3*4/12.12"; 
var results = Regex.Split(input, @"\s*([-+/*])\s*") 
       .Where(n => !string.IsNullOrEmpty(n)) 
       .ToList(); 
Console.WriteLine(string.Join("\n", results)); 
0

あなたが代わりにRegex.SplitのRegex.Matchesを使用することができます。

var test = "1 + 2 - 2.3 * 4/12.12"; 
foreach(Match match in Regex.Matches(test, @"\d+(,\d+)*(\.\d+(e\d+)?)|\d+|[\\+-\\*]")) 
    Console.WriteLine(match.Value); 
0

これは私

FYI
/([\d\.]+)|([+-\/\*])+/g 

のために働くように見えた - LinqPadですC#でRegexをテストする素晴らしいツール