1

我已经在这工作了好几个小时了,我遇到了死胡同。我已经在各处阅读了正则表达式,但我仍然无法匹配比基本模式更复杂的任何内容。

所以,我的问题是这样的:

我需要将分隔为字符串的“&”拆分为对象列表,但我还需要考虑包含与符号的值。

如果您能提供任何帮助,请告诉我。

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

更新:

好的,首先,感谢您的精彩,周到的回复。为了说明我为什么要这样做的一些背景知识,它是在 JavaScript 中创建一个更智能的 cookie 实用程序,并且支持键 ala ASP。

话虽如此,我发现以下 RegExp/([^&=\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';

一切都再次失控。我理解为什么会因为上面的正则表达式而发生这种情况(非常棒的解释值得称赞),但我(显然)对正则表达式不够满意,无法找到解决方法。

就重要性而言,我需要这个 cookie 实用程序能够读取和写入 ASP 和 ASP.NET 可以理解的 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

我需要将&分隔为字符串的“”拆分为对象列表,但我还需要考虑包含与号的值。

你不能。

任何允许字符同时作为特殊字符和数据出现的数据格式都需要一个规则(通常是一种将字符表示为数据的不同方式)来区分两者。

  • HTML 有&&
  • URI 具有&%26
  • CSV 有"""
  • 大多数编程语言都有"并且\"

您的字符串没有任何规则来确定 an&是分隔符还是 & 符号,因此您无法编写可以区分的代码。

于 2012-10-27T09:42:38.347 回答
1

确实,建议使用区分规则,而且,如果键包含与号 - 或等号! - ,则 RegExp 模式可能会失败,但可以使用纯 JavaScript 来完成。您只需要考虑键值对,并接受可能没有 RegExp 模式来解决问题的事实:您必须将字符串拆分为数组,循环遍历元素并合并它们,如果必要的:

<!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&你好吗&FourthKey=就是这样!

拆分/拼接结果:

myTestKey=这是我的测试数据&这样
的myOtherKey=这是另一个值
aThirdKey=Hello=Hi&你
好吗FourthKey=就是这样!

于 2012-10-27T16:34:58.000 回答
0

我建议你使用

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

检查这个演示

于 2012-10-27T14:31:14.670 回答
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 回答