用于分割符号分隔字符串的JavaScript正则表达式

时间:2012-10-27 09:38:21

标签: javascript regex

我已经在这里工作了好几个小时,而且我已经走到了尽头。我已经阅读了所有地方的正则表达式,但是我仍然无法匹配比基本模式更复杂的东西。

所以,我的问题是:

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

如果您能提供任何帮助,请与我们联系。

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

更新

好的,首先,感谢那些令人敬畏的,深思熟虑的回应。为了说明我为什么要这样做的一些背景知识,那就是在JavaScript中创建一个更加智能的cookie实用程序并支持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变得更好...... Crazy。

5 个答案:

答案 0 :(得分:5)

如果您的密钥不能包含&符号,则可以:

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.

这可能不是最有效的方法(因为在每次匹配期间需要多次检查前瞻断言),但它相当简单。

答案 1 :(得分:2)

  

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

你做不到。

允许角色既作为特殊字符又作为数据出现的任何数据格式都需要一个规则(通常以不同的方式将字符表示为数据),以便区分两者。

  • HTML有&&amp;
  • URI包含&%26
  • CSV包含"""
  • 大多数编程语言都有"\"

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

答案 2 :(得分: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 =这是我的测试数据&amp;这样&amp; myOtherKey =这是另一个值&amp; aThirdKey = Hello = Hi&amp;你好吗&FourthKey =那就是它!

拆分/拼接结果:

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

答案 3 :(得分: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,那么你就不幸了。

答案 4 :(得分:0)

我建议您使用

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

检查 this demo