0

必要なものに非常に近い正規表現の回答をたくさん見てきましたが、それほどではありません。問題は、文字で分割する必要がある文字列があることです (例: スペースまたは「=」) が、引用符内にあるもの (引用符内の引用符であっても) を無視したいです。

私が得ることができた最も近いものはこれです:

" (?=(?:[^"]*"[^"]*")*[^"]*$)"

これはうまく機能しますが、2 つの注意点があります。引用符内のタイミングの悪いスペースは不適切な分割を引き起こし、逆方向に読み取ります。私があまり気にしない最初の問題は、私にできることはあまりなく、回避することができます。しかし、2番目は重要です。

場合によっては、正規表現している文字列の最後に誤って引用符がない場合があります。これは私のシステムをあまり気にしませんが、上記の正規表現は逆方向に進むため、すべてが壊れます:

string test = "foo bar \"foo bar\" foobar \"foo"
var result = Regex.Split(test, " (?=(?:[^"]*"[^"]*")*[^"]*$)");

これにより、次のようになります。

foo bar "foo
bar" foobar "foo

最後から始まり、フィルターを逆方向に実行するためです。結果を次のようにする必要があります。

foo
bar
"foo bar"
foobar
"foo

$ が最後の開始の原因であることは知っていますが、それを元に戻す方法を一生理解することはできません。考え?

4

4 に答える 4

0

Regex 1 または Regex 2 でうまくいくと思います。

 # =====================================
 # Regex 1
 # =====================================
 #    ("[^"]")|[\s=]+             // raw
 #    "(\"[^\"]\")|[\\s=]+"       // escped
 #    @"                          // verbatim
 #     (""[^""]"")|[\s=]+
 #    "
 # -------------------------------------
 #    
 #         ( " [^"] " )      # expanded Regex 1
 #      |  
 #         [\s=]+ 

 # =====================================
 # Regex 2
 # =====================================
 #    ("(?:[^"]*"[^"]*")*[^"]*")|[\s=]+             // raw
 #    "(\"(?:[^\"]*\"[^\"]*\")*[^\"]*\")|[\\s=]+"   // escaped
 #    @"                                            // verbatim
 #     (""(?:[^""]*""[^""]*"")*[^""]*"")|[\s=]+
 #    "
 # -------------------------------------
 #        
 #        (                  # expanded Regex 2
 #             " 
 #             (?: [^"]* " [^"]* " )*
 #             [^"]* 
 #             "     
 #        )
 #     |  
 #        [\s=]+ 
于 2013-10-29T19:53:17.830 に答える
0

代わりにこのアプローチを試してみたらどうですか

string test = "foo bar \"foo bar\" foobar \"foo";
if (test.Count(q => q == '"')%2 == 1)
    test += "\"";

test = Regex.Replace(test, "\"[^\"]+\"", "");

奇数の引用符があるかどうかをテストし、奇数の場合は追加します。次に、を使用して引用符内をすべて削除し"\"[^\"]+\""ます。次に、 String.Split() を使用して自由に分割できます

于 2013-10-29T17:42:49.703 に答える