1

次のテキストを含む文字列があります:
[l=9;f=0;r=5;p=2]
There may be more than one:
[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]

文字列の配列を取得したい(2番目の例):

[l=9;f=0;r=5;p=2]
[l=9;f=0;r=6;p=2]

これを試しましたが、正しく分割されませんでした:

Regex.Split(seat, "(?=])");

PS。正規表現は必須ではありません。

4

6 に答える 6

8
string input = "[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]";
var list = Regex.Matches(input, @"\[.+?\]")
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();
于 2012-08-28T10:56:09.233 に答える
3

以下のパターンは、正規表現の分割オプションを使用するのに役立つ場合があります

string input = "[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]";
string pattern = @"(?<=\]);";
Regex regex = new Regex(pattern);
string[] data = regex.Split(input);
于 2012-08-28T11:12:43.010 に答える
0
"[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]".Split(new string[] { "];" }, StringSplitOptions.None)

そして、配列内の各項目に「]」を追加します...

醜いが動作するはずです。

于 2012-08-28T10:53:18.487 に答える
0

あなたのコードで:

Regex.Split(seat, "(?=])");

正規表現から、実際のセミコロンと括弧のバックスラッシュが欠落しているようです。これは機能します:

 string[] data = Regex.Split(seat, ";(?=\\[)");
于 2012-08-28T11:26:07.057 に答える
0

正規表現キャプチャを使用しないのはなぜですか?

パターン\[l=(\d);f=(\d);r=(\d);p=(\d)\]は、各配列の値をキャプチャします。

例:

private static IEnumerable<dynamic> Match(string text)
{
    return Regex.Matches(text, @"\[l=(\d);f=(\d);r=(\d);p=(\d)\]")
        .Cast<Match>()
        .Where(m => m.Success)
        .Select(m => new { l = m.Groups[1].Value, f = m.Groups[2].Value, r = m.Groups[3].Value, p = m.Groups[4].Value });
}

static void Main(string[] args)
{
    foreach (var result in Match("[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]"))
        Console.Out.WriteLine("Setting: {0}, {1}, {2}, {3}", result.l, result.f, result.r, result.p);

    foreach (var result in Match("[l=9;f=0;r=5;p=2]"))
        Console.Out.WriteLine("Setting: {0}, {1}, {2}, {3}", result.l, result.f, result.r, result.p);
}
于 2012-08-28T11:11:59.820 に答える
0

LINQ のアプローチは次のとおりです。

Func<string, string> process = s =>
    String.Format("[{0}]",
        String.Join("];[",
            s
                .Split('[')
                .Select(x => x.Split(']'))
                .SelectMany(x => x)
                .Where(x => x != "" && x !=";")));

少なくともそれは機能します。:-)

次のように使用します。

var result = process("[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]");
于 2012-08-28T11:19:56.947 に答える