1

我有一个这样的文字......

var string = '~a=123~b=234~c=345~b=456'

我需要提取字符串,使其拆分为

['~a=123~b=234~c=345','']

也就是说,我需要用/b=.*/模式拆分字符串,但它应该与最后找到的模式匹配。如何使用 RegEx 实现这一目标?

注意:等号后面的数字是随机生成的。

编辑:

以上只是一个例子。我猜我没有把问题说清楚。广义字符串是...

<word1>=<random_alphanumeric_word>~<word2>=<random_alphanumeric_word>..~..~..<word2>=<random_alphanumeric_word>

都有随机长度,所有单词i都是字母,整个字符串长度不固定。唯一已知的文本是<word2>. 因此我需要 RegEx 和模式/<word2>=.*/

4

5 回答 5

0
(?=.*(~b=[^~]*))\1 

将在一场比赛中完成,但如果有重复的条目,它将转到第一个。性能也不是很好,如果你 string.replace 它将破坏所有重复项。它会通过您的示例,但针对 '~a=123~b=234~c=345~b=234' 它会转到第一个 'b=234'。

.*(~b=[^~]*) 

将运行得更快,但它需要另一个步骤,因为匹配出现在一个组中:

var re = /.*(~b=[^~]*)/.exec(string);
var result = re[1]; //~b=234
var array = string.split(re[1]);

此方法也将具有完全相同的重复项。另一种选择是:

var regex = /.*(~b=[^~]*)/g;
var re = regex.exec(string);
var result = re[1];
// if you want an array from either side of the string:
var array = [string.slice(0, regex.lastIndex - re[1].length - 1), string.slice(regex.lastIndex, string.length)];

这实际上找到了最后一个匹配的确切位置,并删除了regex.lastIndex - re[1].length - 1我的猜测是索引从前导侧删除省略号,但我没有测试它,所以它可能会偏离 1。

于 2014-04-20T05:20:12.453 回答
0

假设格式为 ( ~、字母数字名称、=和数字) 重复任意次数。这里最重要的假设是~每个名称-值对出现一次,并且它不会出现在名称中。

您可以通过简单的替换来删除最后一个令牌:

str.replace(/(.*)~.*/, '$1')

这通过使用 greedy 属性*来强制它匹配~输入中的最后一个。

这也可以通过 来实现lastIndexOf,因为您只需要知道最后一个的索引~

str.substring(0, (str.lastIndexOf('~') + 1 || str.length() + 1) - 1)

(嗯,我不知道上面的代码是不是好的JS......我宁愿写几行。上面只是为了展示单行解决方案)。

于 2013-01-27T19:36:24.693 回答
0

我不认为我会亲自使用正则表达式来解决此类问题,但您可以使用这样的正则表达式提取最后一个选项对:

var str = '~a=123~b=234~c=345~b=456';
var matches = str.match(/^(.*)~([^=]+=[^=]+)$/);

// matches[1] = "~a=123~b=234~c=345"
// matches[2] = "b=456"

演示:http: //jsfiddle.net/jfriend00/SGMRC/

于 2013-01-27T19:36:48.527 回答
0

考虑到您要提取特定部分,这听起来不像是正则表达式的工作。相反,您可以只使用lastIndexOf将字符串一分为二:

var lio = str.lastIndexOf('b=');

var arr = [];
var arr[0] = str.substr(0, lio);
var arr[1] = str.substr(lio);

http://jsfiddle.net/NJn6j/

于 2013-01-27T19:24:52.727 回答
0

将给出您可以使用的结果的正则表达式是:

string.match(/[a-z]*?=(.*?((?=~)|$))/gi);
// ["a=123", "b=234", "c=345", "b=456"]

但在您的情况下,最简单的解决方案是在提取内容之前拆分字符串:

var results = string.split('~'); // ["", "a=123", "b=234", "c=345", "b=456"]

现在将很容易提取键和结果以添加到对象:

var myObj = {};
results.forEach(function (item) { 
    if(item) { 
        var r = item.split('='); 
        if (!myObj[r[0]]) {
            myObj[r[0]] = [r[1]]; 
        } else {
            myObj[r[0]].push(r[1]); 
        }
    } 
});
console.log(myObj);

目的:

  • 一个:[“123”]
  • b: ["234", "456"]
  • c: [“345”]
于 2013-01-27T19:30:17.597 回答