1

文字列の配列に分割する必要がある文字列があります。すべての値はパイプ|で区切られ、カンマで区切られています。

|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||

配列は、分割後に次の 8 つの値を持つ必要があります。

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""

"" とは、単に空の文字列を意味します。値には、2,2 のようにカンマを含めることもできます。おそらくこれを行う最善の方法は Regex.Split を使用することだと思いますが、正しい正規表現の書き方がわかりません。これを達成するための提案やより良い方法は本当にありがたいです。

4

6 に答える 6

2

パイプ文字間の値にパイプ文字自体が含まれていない限り、Match()代わりに値を取得するために使用できます。split()

(?<=\|)[^|]*(?=\|)

[^|]*これは、パイプが前後(?<=\|)に続く0 個以上の非パイプ文字に一致します(?=\|)

C# の場合:

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)"); 
foreach (Match match in results)
     Console.WriteLine("Found '{0}' at position {1}", 
                       match.Value, match.Index);

編集:コンマは常にパイプ文字の間にある値を区切るため|、セパレータとして使用されるコンマは常に奇数の間隔で表示されるため、配列の偶数インデックスのみを調べて、次のように真の値を取得できます。

var input = "|room 1|,|,|,||,||,||,||,||,||";

var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)");

for (int i = 0; i < results.Count; i+=2)
    Console.WriteLine("Found '{0}'", results[i].Value);

これは、上記の最初の例でも使用できます。

于 2013-11-08T16:29:29.053 に答える
1

正規表現を使用する必要はありません。パイプを削除し、文字列をカンマで分割します。

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";

var parts = input.Split(',').Select(x => x.Replace("|", string.Empty));

また

var parts = input.Replace("|", string.Empty).Split(',');


EDIT : OK、その場合、while ループを使用して文字列を解析します。

var values = new List<string>();
var str = @"|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";;
while (str.Length > 0)
{
    var open = str.IndexOf('|');
    var close = str.IndexOf('|', open + 1);

    var value = str.Substring(open + 1, open + close - 1);
    values.Add(value);

    str = open + close < str.Length - 1 
            ? str.Substring(open + close + 2) 
            : string.Empty;
}
于 2013-11-08T16:29:32.560 に答える
1

すべてのフィールドがパイプで囲まれ、コンマで区切られていると仮定すると、|,| を使用できます。区切り文字として、先頭と末尾の | を削除します。

Dim data = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||"
Dim delim = New String() {"|,|"}
Dim results = data.Substring(1, data.Length - 2).Split(delim, StringSplitOptions.None)

For Each s In results
  Console.WriteLine(s)
Next

出力:

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""
于 2013-11-08T17:03:09.777 に答える
0

これがあなたのニーズに合っているかどうかを確認してください...

var str = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";  
//Iterate through all your matches (we're looking for anything between | and |, non-greedy)                     
foreach (Match m in Regex.Matches(str, @"\|(.*?)\|"))
{
    //Groups[0] is entire match, with || symbols, but [1] - something between ()
    Console.WriteLine(m.Groups[1].Value);
}

ただし、 | の間で何かを見つけるには および | の場合は、 の代わりに [^\|] を使用する可能性があり、おそらく使用する必要があります。キャラクター。

少なくとも、指定されたユースケースでは、期待どおりの結果が得られます。

于 2013-11-08T17:09:17.703 に答える
0

うーん、これはあなたのために働くかもしれません:

var data = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|", "").Split(',');

よろしく。

k

編集:ワイルドカードを使用できます

string data = "|111|,|2,2|,|,3|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|,|", "¬").Replace("|", "").Split('¬');

よろしく。

k

于 2013-11-08T16:33:59.897 に答える