2017-07-13 8 views
3

文字列の分割に正規表現パターン((?!(SEPARATOR)).)*を使用します。(?!...)regexパターンを使用して不一致部分全体をスキップする方法は?

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     var separator = "__"; 
     var pattern = String.Format("((?!{0}).)*", separator); 
     var regex = new Regex(pattern); 

     foreach (var item in regex.Matches("first__second")) 
      Console.WriteLine(item);   
    } 
} 

SEPARATORは単一の文字ですが、それが長いときに1つの文字が、私は予想外の結果を得るときには正常に動作します。上記のコードでは、2番目に一致する文字列は "second"の代わりに "_second"です。一致しないセパレータ全体をスキップするためにパターンを変更するにはどうすればよいですか?

私の本当の問題は、引用符で囲んだ行区切りをスキップする必要がある行を分割することです。私の行区切り記号はあらかじめ定義された値ではなく、たとえば "\ r \ n"とすることができます。

+0

いいえ、そのパターンで分割してください。それが正規表現パターンであれば、 'Regex.Split'を使用してください。' __'のようなリテラル固定文字列であれば 'string.Split'を使用してください。 .NET正規表現で* matching *することで、あなたが望むものを達成することはできません。 PCREでは '(* SKIP)(* FAIL)'動詞を使用しますが、.NETではサポートされていません。 –

+1

これに 'string.Split'を使わないのはなぜですか? Ex。 '' first__second ".Split(new [] {" __ "}、StringSplitOptions.None);' – ZarX

+0

私のパターンはより複雑なので、regexを使いたいと思います。 String.Splitは私の目的には十分ではありません。 – user1701074

答えて

1

あなたはこのような何かを行うことができます。

using System; 
using System.Text.RegularExpressions; 

public class Example 
{ 
    public static void Main() 
    { 
     string input = "plum--pear"; 
     string pattern = "-";   // Split on hyphens 

     string[] substrings = Regex.Split(input, pattern); 
     foreach (string match in substrings) 
     { 
     Console.WriteLine("'{0}'", match); 
     } 
    } 
} 


// The method displays the following output: 
// 'plum' 
// '' 
// 'pear' 
0

.NETの正規表現は、特定の複数文字の文字列以外のテキストの一部をマッチングサポートしていませんしません。 PCREでは、(*SKIP)(*FAIL)動詞を使用しますが、ネイティブの.NET正規表現ライブラリではサポートされていません。確かに、あなたはPCRE.NETを使用する場合がありますが、.NETの正規表現は、通常、あなたが、たとえば、[anything here]が、すべてを一致させる必要がある場合は、あなたが

var res = Regex.Split(s, @"\[[^][]*]").Where(m => !string.IsNullOrEmpty(m)); 

の場合を使用することができますRegex.Split

とよくこれらのシナリオを扱うことができますセパレータは__のような単純なリテラルの固定された文字列で、ちょうどString.Splitを使用します。あなたの本当問題については

、あなたが必要とするすべての

var res = Regex.Matches(s, "(?:\"[^\"]*\"|[^\r\n\"])+") 
    .Cast<Match>() 
    .Select(m => m.Value) 
    .ToList(); 

それは文字0+、"の発生(原因最終+に)1+一致するregex demo

を参照してくださいようですCR、LFおよび/または"[^\r\n"]参照)以外の任意の文字である"以外に、""[^"]*"ブランチ)または(|

関連する問題