如何删除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)];