如何在javascript中删除最后匹配的正则表达式模式

时间:2013-01-27 19:17:02

标签: javascript regex

我有一个类似的文字......

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>=.*/

5 个答案:

答案 0 :(得分:0)

考虑到你想提取一个特定的作品,这听起来不像是regexen的工作。相反,您可以使用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/

答案 1 :(得分:0)

将提供您可能使用的结果的RegExp是:

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);

对象:

  • a:[“123”]
  • b:[“234”,“456”]
  • c:[“345”]

答案 2 :(得分:0)

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

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

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

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

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

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

(好吧,我不知道上面的代码是不是很好用JS ......我宁愿写几行。上面只是用于显示单行解决方案。)

答案 3 :(得分: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/

答案 4 :(得分: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关闭