1

私は何時間もこれにいて、行き止まりになっています。私は至る所で正規表現を読んだことがありますが、基本的なパターンよりも複雑なものとのマッチングにまだ問題があります。

だから、私の問題はこれです:

文字列で区切られた「&」をオブジェクトのリストに分割する必要がありますが、アンパサンドを含む値も考慮する必要があります。

ご不明な点がございましたら、お気軽にお問い合わせください。

var subjectA = 'myTestKey=this is my test data & such&myOtherKey=this is the other value';

アップデート:

さて、そもそも、素晴らしく思慮深い回答に感謝します。私がこれを行っている理由について少し背景を説明するために、JavaScriptでもう少しインテリジェントで、ASPのキーをサポートするCookieユーティリティを作成することです。

そうは言っても、次の正規表現は/([^&=\s]+)=(([^&]*)(&[^&=\s]*)*)(&|$)/g私が必要としていることの99%を実行していることがわかりました。以下の寄稿者によって提案されたRegExpを変更して、空のスペースも無視するようにしました。これにより、上記の文字列を次のコレクションに変換できました。

[
    [myTestKey, this is my test data & such],
    [myOtherKey, this is the other value]]
]

それはいくつかのより極端な例でも機能し、次のような文字列を回すことができます。

var subjectB = 'thisstuff===myv=alue me==& other things=&thatstuff=my other value too';

の中へ:

[
    [thisstuff, ==myv=alue me==& other things=],
    [thatstuff, my other value too]
]

ただし、次のような文字列を使用する場合:

var subjectC = 'me===regexs are hard for &me&you=&you=nah, not really you\'re just a n00b';

すべてが再び強打から抜け出します。上記の正規表現の結果としてこれが発生する理由は理解できますが(非常に素晴らしい説明のためのkudos)、回避策を理解するための正規表現に(明らかに)十分に慣れていません。

重要な限り、ASPとASP.NETで理解できるCookieを読み書きできるようにするには、このCookieユーティリティが必要です。その逆も同様です。上記の例で遊んでみて、できる限りのことを考えていますが、間違っている場合は、追加の入力をいただければ幸いです。

tl; dr-ほぼそこにありますが、?のような外れ値を説明することは可能subjectCですか?

var subjectC = 'me===regexs are hard for &me&you=&you=nah, not really you\'re just a n00b';

実際の出力:

[
    [me, ==regexs are hard for &me],
    [you, ],
    [you, nah, not really you\'re just a n00b]
]

期待される出力との比較:

[
    [me, ==regexs are hard for &me&you=],
    [you, nah, not really you\'re just a n00b]
]

いつもお世話になっております。また、私は実際にRegExpで良くなっています...クレイジー。

4

5 に答える 5

7

キーにアンパサンドを含めることができない場合は、次の可能性があります。

var myregexp = /([^&=]+)=(.*?)(?=&[^&=]+=|$)/g;
var match = myregexp.exec(subject);
while (match != null) {
    key = match[1];
    value = match[2];
    // Do something with key and value
    match = myregexp.exec(subject);
}

説明:

(        # Match and capture in group number 1:
 [^&=]+  # One or more characters except ampersands or equals signs
)        # End of group 1
=        # Match an equals sign
(        # Match and capture in group number 2:
 .*?     # Any number of characters (as few as possible)
)        # End of group 2
(?=      # Assert that the following can be matched here:
 &       # Either an ampersand,
 [^&=]+  # followed by a key (as above),
 =       # followed by an equals sign
|        # or
 $       # the end of the string.
)        # End of lookahead.

これはこれを行うための最も効率的な方法ではないかもしれませんが(各一致中に数回チェックする必要がある先読みアサーションのため)、それはかなり簡単です。

于 2012-10-27T09:52:40.000 に答える
2

文字列で区切られた""をオブジェクトのリストに分割する必要が&ありますが、アンパサンドを含む値も考慮する必要があります。

できません。

文字を特殊文字としてもデータとしても表示できるデータ形式には、2つを区別できるようにするためのルール(通常は文字をデータとして表現する別の方法)が必要です。

  • HTMLに&&
  • URIには&%26
  • CSVに"""
  • ほとんどのプログラミング言語に"\"

文字列には、が区切り文字であるかアンパサンドであるかを判断するためのルール&がないため、違いがわかるコードを記述できません。

于 2012-10-27T09:42:38.347 に答える
1

確かに、区別するためのルールが推奨されます。また、キーにアンパサンドまたは等号が含まれている場合、RegExpパターンは失敗する可能性がありますが、プレーンJavaScriptを使用して実行できます。キーと値のペアの観点から考える必要があり、問題を解決するための正規表現パターンがない可能性があるという事実に耐える必要があります。文字列を配列に分割し、要素をループして、次の場合にそれらをマージする必要があります。必要:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <style id="styleTag" type="text/css">
        </style>
        <script type="text/javascript">
        window.onload = function()
        {
            // test data
            var s = "myTestKey=this is my test data & such&myOtherKey=this is the other value&aThirdKey=Hello=Hi&How are you&FourthKey=that's it!";

            // the split is on the ampersand symbol!
            var a = s.split(/&/);

            // loop through &-separated values; we skip the 1st element
            // because we may need to address the previous (i-1) element
            // in our loop (you are REALLY out of luck if a[0] is not a
            // key=value pair!)
            for (var i = 1; i < a.length; i++)
            {
                // the abscence of the equal symbol indicates that this element is
                // part of the value of the previous key=value pair, so merge them
                if (a[i].search(/=/) == -1)
                    a.splice(i - 1, 2, a[i - 1] + '&' + a[i]);
            }

            Data.innerHTML = s;
            Result.innerHTML = a.join('<br/>');
        }
        </script>
    </head>
    <body>
        <h1>Hello, world.</h1>
        <p>Test string:</p>
        <p id=Data></p>
        <p>Split/Splice Result:</p>
        <p id=Result></p>
    </body>
</html>

出力:

こんにちは世界。

テスト文字列:

myTestKey =これは私のテストデータです&such&myOtherKey =これは他の値です&aThirdKey = Hello = Hi&How are you&FourthKey =それだけです!

分割/スプライスの結果:

myTestKey =これは私のテストデータであり、そのような
myOtherKey=これは他の値です
aThirdKey= Hello = Hi&How are you
FourKey =それだけです!

于 2012-10-27T16:34:58.000 に答える
0
"myTestKey=this is my test data & such&myOtherKey=this is the other value".split(/&?([a-z]+)=/gi)

これは次を返します:

["", "myTestKey", "this is my test data & such", "myOtherKey", "this is the other value"]

しかし、のような記号this is my test data & suchも含まれている場合は、運が悪いです。=this is my test data &such= something else

于 2012-10-27T09:53:30.357 に答える
0

使用することをお勧めします

.split(/(?:=|&(?=[^&]*=))/);

このデモを確認してください。

于 2012-10-27T14:31:14.670 に答える