我需要从输入表单中获取字符串中的值以用于搜索,我将举例说明:
示例1:name="Peter Nash","Costa"
,应该返回Peter Nash和Costa
示例2:name='Peter Nash',"Costa"
,应该返回:Peter Nash和Costa
示例3:name="Peter Nash"
,应该返回:Peter Nash
示例4:name=Peter,"Costa"
,应该返回:Peter和Costa
例5:name=Peter,Costa
,应该返回:Peter和Costa
例6:name=Peter
,应该返回:Peter。
name
是一个变量,它可以改变。
现在我使用new RegExp(string_var + "\:([^ ]+)", "").exec(input);
这样的内容,但不使用引号或逗号。
答案 0 :(得分:0)
正则表达式:
(?!^name=)("|')?(?<first_name>([A-z]|\s)*)("|')*(\,{0,1})("|')*(?<second_name>(([A-z]|\s)*))("|')*$
代码示例:
let s = [
"name=\"Peter Nash\",\"Costa\"",
"name=\"Peter Nash\",\"Costa\"",
"name='Peter Nash',\"Costa\"",
"name=\"Peter Nash\"",
"name=Peter,\"Costa\"",
"name=Peter,Costa",
"name=Peter",
];
const regex = /(?!^name=)("|')?(?<first_name>([A-z]|\s)*)("|')*(\,{0,1})("|')*(?<second_name>(([A-z]|\s)*))("|')*$/;
s.forEach(function(input){
let regexResult = regex.exec(input);
let output = regexResult["groups"]["first_name"];
if(regexResult["groups"]["second_name"]!=""){
output += ' AND ' + regexResult["groups"]["second_name"];
}
console.log(output);
});
&#13;
答案 1 :(得分:0)
在其核心,您的示例文本以逗号分隔,并带有可选引号,可以这样对待。因此,.split正则表达式是解决这个问题的正确方法。常规格式的唯一例外是您的变量名称前缀。以下拆分模式可以解决这个问题:
name=|,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
由于您不希望在输出中包含var名称,因此我将.filter
输出。此外,通过.replace
在每个元素上使用.map
删除引号。
代码示例:最后,所有内容都包含在一个很好的函数中:
function splitString(stringToSplit, separator) {
var arr = stringToSplit.split(separator)
.map(str => str.replace(/^["']|["']$/g, ``)) //remove surrounding quotes
.filter(Boolean); //filter zero length results
console.log('The array has ' + arr.length + ' elements: ' + arr.join(' and '));
}
const comma = /name=|,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/gm;
splitString(`name="Peter Nash","Costa"`, comma);
splitString(`name='Peter Nash',"Costa"`, comma);
splitString(`name="Peter Nash"`, comma);
splitString(`name=Peter,"Costa"`, comma);
splitString(`name=Peter,Costa`, comma);
splitString(`name=Peter`, comma);
答案 2 :(得分:0)
您还可以做的是将字符串分割为name=
,然后将第二部分作为逗号分隔列表。然后,您可以使用正则表达式捕获3个组并在第三个组(\1)
中使用反向引用,以确保起始引用具有相同的结束引用。
然后将replace与第二组\$2
let pattern = /^(["'])(.*)(\1)$/;
如果您还允许"Costa'
,则可以省略反向引用并将模式替换为:
let pattern = /^(["'])(.*)(['"])$/;
let pattern = /^(["'])(.*)(\1)$/;
const strings = [
"name=\"Peter Nash\",\"Costa\"",
"name=\"Peter Nash\",\"Costa\"",
"name='Peter Nash',\"Costa\"",
"name=\"Peter Nash\"",
"name=Peter,\"Costa\"",
"name=Peter,Costa",
"name=Peter",
"test",
"test,",
"name= ",
"name=\"Peter' test \" Nash\",\"Costa\"",
"name='Peter Nash\",\"Costa'"
];
strings.forEach((str) => {
let spl = str.split("name=");
if (spl.length === 2 && spl[1].trim() !== "") {
let result = spl[1].split(",").map(s => s.replace(pattern, "$2"));
console.log(str + " ==> " + result.join(" and "));
}
});
&#13;