我有一个类似的文字......
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>=.*/
答案 0 :(得分:0)
考虑到你想提取一个特定的作品,这听起来不像是regexen的工作。相反,您可以使用lastIndexOf
将字符串拆分为两个:
var lio = str.lastIndexOf('b=');
var arr = [];
var arr[0] = str.substr(0, lio);
var arr[1] = str.substr(lio);
答案 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);
对象:
答案 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"
答案 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关闭