带或不带引号的正则表达式以及用逗号分隔的一个或多个

时间:2018-06-03 00:41:08

标签: javascript regex

我需要从输入表单中获取字符串中的值以用于搜索,我将举例说明:

示例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);这样的内容,但不使用引号或逗号。

3 个答案:

答案 0 :(得分:0)

正则表达式:

(?!^name=)("|')?(?<first_name>([A-z]|\s)*)("|')*(\,{0,1})("|')*(?<second_name>(([A-z]|\s)*))("|')*$

this

代码示例:

&#13;
&#13;
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;
&#13;
&#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 = /^(["'])(.*)(['"])$/;

&#13;
&#13;
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;
&#13;
&#13;