0

この(?<=^.*?;).*式を使用して、ユーザー ID を 1 つずつ解析しています。で区切られているのでうまくいきますが、IDの;最後にいない最後の人になると失敗します。;私が使用する次のIDに到達するには^.*?;

すべては問題aharrisありませんが、それが失敗し、私に与え続けますaharris。すでに私に与えたので、これ^.*?;は私に与えるべきではありません。aharris(?<=^.*?;).*aharris

サンプル文字列:

jsmith; bbrown; kosborne; aharris

さて、^.*?;最後の人が持っていない場合に空の文字列を与える場所を追加または切り替える方法はありますか;

私が理にかなっていることを願っています。

4

2 に答える 2

1

例の文字列が構造化されている方法では、次のパターンを使用して分解できます。

"((?:^|; )(?<userId>.*?))+"

括弧の最初のサブセットは、行の先頭 (最初の項目の場合)、またはセミコロンとそれに続くスペース (その他すべての場合) のいずれかに一致する「非キャプチャ」グループです。括弧の 2 番目のサブセットは、任意の文字セットに貪欲に一致し (パターン全体に一致する最小の文字セットが使用されることを意味します)、その名前で参照できるコレクションにそれらを「キャプチャ」します。ユーザーID"。

このパターンを次のように使用します (System.Text.RegularExpressions および System.Linq を参照/使用する必要があります)。

var match = Regex.Match(input, pattern);
var userIds = match.Groups["userId"].Captures.OfType<string>().ToList();

完了すると、userIds はインスタンス化さList<string>れ、この文字列から 4 つの userIds すべてが取り込まれます。

于 2012-05-02T20:06:56.310 に答える
0

使用する

 "jsmith; bbrown; kosborne; aharris".Split(';').Select(x => x.Trim()).ToList()

代わりは。

コメントでの議論は、次の提案につながります。

 Regex.Matches("\w+(?=\s*;)", "jsmith; bbrown; kosborne; aharris").Cast<Match>().Select(m => m.Value).ToList()
于 2012-05-02T19:56:09.190 に答える