0

事前に警告しておきますが、私の正規表現の理解は非常に限られています (何年にもわたって正規表現を習得するために最善を尽くしてきましたが、正直なところ、正規表現は私を怖がらせるだけだと思います.)

次の文字列があるとします。

string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f"

この文字列は、ユーザー定義の文字列 (この場合は||) (例: key1=value1||key2=value2) で区切られたキーと値のペアを表します。この文字列からキーを抽出して配列に格納しようとしています。その配列は次のようになります。

{"CustomerId", "OrderId", "UserId"}

私が考えることができる最良のオプションは、正規表現を使用することです (誰かがより良い解決策を持っている場合は、共有してください)。これが私がやろうとしていることです:

string delimiter = "||";
string[] keys = Regex.Split(keyValues, "=.*" + delimiter);

私が間違っているかもしれませんが、私が理解しているように、正規表現は、 で始まり で=終わる文字列を検索することになっていますdelimiter。これらの位置で文字列が分割され、元のキーが残りますが、代わりにキー配列は次のようになります。

{"", "C", "u", "s", "t", "o", "m", "e", "r", "I", "d", "", "", ...}

ご覧のとおり、=value||パーツが剥がれています。誰が私が間違っているのか教えてもらえますか?

編集

私の場合、区切り文字||は変数です。への参照を に置き換えることができると思ったので、これについては言及しませんでし||delimiter。与えられた回答の大部分から、それが重要な詳細であることがわかりました。

4

4 に答える 4

3

|は、正規表現で特別な意味を持ちます (または のいずれかにpatA|patB一致します)。逃げる。patApatB|

貪欲でない一致 ( .*?) を使用する:

string delimiter = "||";
string[] keys = Regex.Split(keyValues, @"=.*?" + Regex.Escape(delimiter));

これにより、 が得られます{"CustomerId", "OrderId", "UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f"}

Matches先読みアサーションを使用する方が適切です。

string delimiter = "||";
string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f";
string pattern = @"(?<=^|" + Regex.Escape(delimiter) + @")\w+(?==)";
var keys = Regex.Matches(keyValues, pattern);

ところで、@"verbatim string literal"正規表現を表現するときは、逐語的な文字列リテラル ( ) を使用します。

デモ

于 2013-10-29T15:36:15.800 に答える
2

キーだけを気にする場合は、以下を使用して分割の代わりに一致を使用してみませんか?

@"[^=|]+(?==)"

キーに等号=または縦線を含めることができない場合、上記の式は、そうでないか等号が後に続く|1 つ以上の文字に一致し、キーに一致します。=|=

C# の場合:

var input = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f";
var results = Regex.Matches(input, @"[^=|]+(?==)");
于 2013-10-29T15:39:30.243 に答える
0

分割@"=[^|]*(?:\|\||$)"
する さらに保証が必要な場合は、使用してください@"=[^=|]*(?:\|\||$)"

区切り文字が存在しない end を消費するように編集されました。
C# の場合は、空白のない要素を使用するようにしてください。

于 2013-10-29T15:44:58.370 に答える