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

如何删除javascript中最后匹配的正则表达式模式,javascript,regex,Javascript,Regex,我有一段文字是这样写的 var string = '~a=123~b=234~c=345~b=456' 我需要提取字符串,以便将其拆分为 ['~a=123~b=234~c=345',''] 也就是说,我需要使用/b=.*/pattern拆分字符串,但它应该与最后找到的模式匹配。如何使用RegEx实现这一点 注:等号后出现的数字是随机生成的 编辑: 以上只是一个例子。我想我没有把问题说清楚。 广义字符串正在 <word1>=<random_alphanumeric_word&

我有一段文字是这样写的

var string = '~a=123~b=234~c=345~b=456'
我需要提取字符串,以便将其拆分为

['~a=123~b=234~c=345','']
也就是说,我需要使用/b=.*/pattern拆分字符串,但它应该与最后找到的模式匹配。如何使用RegEx实现这一点

注:等号后出现的数字是随机生成的

编辑:

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

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

所有的字长都是随机的,所有的字i都是字母表,整个字符串的长度不是固定的。唯一已知的文本是。因此,我需要正则表达式,模式为/=.*/

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

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

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

可提供您可以使用的结果的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:[234456] c:[345] 假设格式为~,字母数字名称,=,数字重复任意次数。这里最重要的假设是~对于每个名称-值对显示一次,而不显示在名称中

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

str.replace(/(.*)~.*/, '$1')
其工作原理是使用贪婪属性*强制它匹配输入中的最后一个~

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


嗯,我不知道上面的代码是否是好的JS。。。我宁愿写几行。以上仅用于显示一个线性解决方案。

我个人不认为我会使用正则表达式解决此类问题,但您可以使用正则表达式提取最后一个选项对,如下所示:

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"
演示:

将在一个匹配中完成,但如果有重复条目,将转到第一个。性能也不是很好,如果您使用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]。我猜长度-1是索引从开头删除省略号的原因,但我没有测试它,因此它可能会以1为准。

您的方法非常适合我的需要,但我试图知道regex仅用于匹配最后一个模式,如果可能的话,比如通过改变贪婪度。
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)];