我正在尝试搜索给定字符串上的子字符串。
// format is <stringIndex>~<value>|<stringIndex>~<value>|<stringIndex>~<value>
var test = "1~abc1|2~def2|1~ghi3|4~jk-l4|5~123|6~sj2j";
function getValue(test, stringIndex) {
// format is <stringIndex>~<value>|<stringIndex>~<value>|<stringIndex>~<value>
//help with this.
//I can only get the value if 1 is the passed parameter, here is the code:
return test.replace(new Regexp(stringIndex + '\~(.+?(?=\|)).+'), '$1');
}
// usage:
getValue(test, '1'); //returns 'abc1', even though there are two 1's
getValue(test, '4'); //returns 'jk-14'
getValue(test, '6'); //returns 'sj2j'
getValue(test, '123213'); // returns ''
基本上,我正在编写一个接受test
字符串和stringIndex
作为参数的函数,并使用test
搜索stringIndex
字符串并返回与之相关的价值。测试字符串的格式在上面的注释中说明。
我只是在不使用循环或拆分的情况下寻找正则表达式解决方案。
答案 0 :(得分:1)
你可能想要这个正则表达式代码:
function getValue(test, stringIndex) {
// format is <stringIndex>~<value>|<stringIndex>~<value>|<stringIndex>~<value>
//help with this.
//I can only get the value if 1 is the passed parameter, here is the code:
var m = test.match(new RegExp(stringIndex + "~([^|]+)", 'i')) || [null, null];
return m[1];
}
然后将其称为:
getValue(test, '1');
"abc1"
getValue(test, '4');
"jk-l4"
getValue(test, '6');
"sj2j"
getValue(test, '123213');
null
答案 1 :(得分:1)
以上是两个答案的更新,我们需要为正则表达式添加“\ b”。
// modified the test string.
var test = "311~abc1|2~def2|1~ghi3|4~jk-l4|5~123|6~sj2j";
function getValue(test, stringIndex) {
var m = test.match(new RegExp("\\b" + stringIndex + "~([^|]+)", 'i')) || [null, null];
return m[1];
}
> getValue(test, '1');
'ghi3'
> getValue(test, '2');
'def2'
> getValue(test, '11');
null
> getValue(test, '311');
'abc1'
答案 2 :(得分:0)
有很多方法可以编写正则表达式来匹配模式,这实际上取决于用例的特殊性。这是一个解决方案:
var test = "1~abc1|2~def2|1~ghi3|4~jk-l4|5~123|6~sj2j";
function getValue(test, stringIndex) {
var matches = test.match(new RegExp(stringIndex + "~([\\w-]+)\\|?"));
return matches ? matches[1] : "";
}
getValue(test, '1'); // 'abc1'
getValue(test, '4'); // 'jk-14'
getValue(test, '6'); // 'sj2j'
getValue(test, '123213'); // ''