1

次の条件に対応できる正規表現を見つけようとしています。

基本的に、以下の行は変数とその値のキー ペアであり、テキスト行で表されます。

  1. 変数名は A-Za-z0-9 にすることができます
  2. コンマでペアを区切ります
  3. 値は、等号やコンマを含め、何でもかまいません

Variable1=somevalue1,Variable2=somevalue2,Variable3=some,value2

私は次の試合を期待しています:

  1. Variable1=somevalue1
  2. Variable2=somevalue2
  3. Variable3=some,value2

どんな助けでも大歓迎です、ありがとう

4

4 に答える 4

5

要件は決定論的ではないため、単一の結果が得られず、正規表現ではニーズを処理できません。

たとえば、サンプルには次の結果が含まれる場合があります。

  • マッチ1
    • Variable1 => somevalue1,Variable2=somevalue2,Variable3=some,value2
  • マッチ2
    • 変数 1 => 何らかの値 1
    • Variable2 => somevalue2,Variable3=some,value2
  • マッチ3
    • 変数 1 => 値 1、変数 2 = 値 2
    • 変数 3 => 一部、値 2

等々。

そのため、値または他の種類の変数分離に引用符を付けることを検討することをお勧めします。

于 2013-06-06T10:04:04.717 に答える
1

文字列を逆にトラバースし、最後の文字列から文字列の末尾に等しい部分文字列を値として取得し、次に変数名について、途中で削除し、すべての変数が処理されるまで繰り返すことで、これを部分的に解決しました。

私は 1 つの譲歩をしなければなりませんでした。それは、ユーザーが変数値に equals を使用したい場合は、特別な値 !!EQUALS!! を使用する必要があるということです。VariableValue クラスで値がインスタンス化されたときに置き換えます

この荘園で 1000 行を解析するパフォーマンス テストには 0.0019 秒かかりました。とても速いです。

文字列の「抽出」メソッドは、部分文字列を出力し、一致した部分文字列を削除して元の文字列を返す、私が作成した拡張メソッドです。

        public List<VariableValue> ExtractVariables(string line)
        {
            var variables = new List<VariableValue>();

            while (line != string.Empty)
            {
                // Get the value 
                var value = string.Empty;
                var lastEquals = line.LastIndexOf('=') + 1;
                line = line.Extract(lastEquals, line.Length - lastEquals, out value);

                // Get the variable
                var variable = string.Empty;
                var lastComma = line.LastIndexOf(',') + 1;
                line = line.Extract(lastComma, line.Length - lastComma - 1, out variable);

                // Add to list of results
                variables.Add(new VariableValue(variable, value));

                // Remove the trailing bits
                line = (line == "=")
                           ? string.Empty
                           : line.Remove(line.LastIndexOf(','), line.Length - line.LastIndexOf(','));
            }

            variables.Reverse();
            return variables;
        }

私の解決策についてどう思いますか?

于 2013-06-06T11:02:51.623 に答える
1

区切り文字を含む値には明らかに問題があります。

ただし、キーにこれらの区切り文字を含めることができない限り、これらは賢明に処理できます。秘伝のタレのレシピはこんな感じ。

/(?:,|^)(?=[^,]+=)/

最初に、コンマまたは文字列の先頭のいずれかが存在し、その後に次の等号までコンマがないことをアサートします。実際には、これは特定のキーと値のペアの最後のカンマで分割されます。

次に、結果をループして、最初の等号で分割します。

したがって、最終的には次のようになります(明らかに、選択した言語に翻訳されています。私はPHPを使用しましたが、重要なのはロジックです):

<?php

    $str = 'Variable1=somevalue1,Variable2=somevalue2,Variable3=some,value2';

    $result = [];
    foreach (preg_split('/(?:,|^)(?=[^,]+=)/', $str, -1, PREG_SPLIT_NO_EMPTY) as $item) {
        $item = explode('=', $item, 2);
        $result[$item[0]] = isset($item[1]) ? $item[1] : '';
    }

    print_r($result);

生成するもの:

Array
(
    [Variable1] => somevalue1
    [Variable2] => somevalue2
    [Variable3] => some,value2
)

動いているのを見る

于 2013-06-06T11:05:32.620 に答える