2016-10-31 17 views
1

Regex.Splitで文字列を分割し、すべての区切り文字を保持する方法は?Regex.Splitで文字列を分割し、すべての区切り文字を保持する方法は?

文字列「substring1 delimeter1 substring2」があります。ここでdelimeter + substring2はアドレ​​スの一部です。

また、2つ以上のデリミタがあります。delim1、delim2は意味が同等です。

と私は、このような文字列の配列を取得したい:私はパターン持っ

arr[0]="subsctring1"; 
arr[1]="delim1 subsctring2"; 

または、

arr[1]="delim2 subsctring2; 

を:

addrArr= Regex.Split(inputText, String.Concat("(?<=",delimeter1, "|",delimeter2, ")"), RegexOptions.None); 

をしかし、それはうまく動作しません。

これに有効なパターンを作成する手助けができますか?

答えて

2

あなただけ先読みしてパターンを必要とする:(あなたの文字列に空白が含まれているため)

\s+(?=delim1|delim2) 

\s+は、1つのまたはそれ以上の空白にマッチします。空白がない場合は、\s*を使用します(ただし、結果から空のエントリを削除する必要があります)。 regex demoを参照してください。これらの区切り文字が完全な単語でなければならない場合は、\bの単語境界:\s+(?=\b(?:delim1|delim2)\b)を使用してください。 C#ので

addrArr = Regex.Split(inputText, string.Format(@"\s+(?={0})", string.Join("|", delimeters))); 

区切り文字は特別な正規表現のメタ文字を含めることができる場合、あなたはリストにRegex.Escapeを実行する必要があります。

C# demo

var inputText = "substring1 delim1 substring2 delim2 substr3"; 
var delimeters = new List<string> { "delim1", "delim2" }; 
var addrArr = Regex.Split(inputText, 
     string.Format(@"\s+(?={0})", string.Join("|", delimeters.Select(Regex.Escape)))); 
Console.WriteLine(string.Join("\n", addrArr)); 
+0

はこれを試してみてください。 :) 'Regex.Escape'に関しては、入力に無効な文字が含まれていなくても、パターンをリテラルと連結するときには常に*使用することをお勧めします。後でコードがどのように使用されるかに応じて、そうしなければ攻撃ベクトルを開く可能性があります(無効なパターンや場合によってはさらに悪いためにアプリケーションがクラッシュする)。 – Lucero

+0

'Regex.Escape'では、パターンは[' string.Format(@ "\ s +(?= {0})"のようになります、string.Join( "|"、delimeters.Select(Regex.Escape)) ) '](http://ideone.com/BeQlum)。ただし、デリミタに開始/終了時に非ワード文字が含まれている場合は、 '\ b'を使用することはできません。カスタムロジックが必要です。 –

2

私はあなたが(ただし、それを試していない)、これが動作するために、先読み、後読みでないを使用する必要があると思います。

また、セパレータには注意が必要です。彼らは正規表現のパターンとして正しく動作するためにエスケープする必要があります。あなたは数秒で私を倒す

addrArr= Regex.Split(inputText, string.Format("(?={0}|{1})", Regex.Escape(delimeter1), Regex.Escape(delimeter2)), RegexOptions.None); 
関連する問題