如何在RegEx中分割可选参数?

时间:2019-05-16 12:47:16

标签: javascript regex

实际上我有以下RegExp表达式:

/^(?:(?:\,([A-Za-z]{5}))?)+$/g

因此,接受的输入应类似于,IGORA,但即使是,IGORA,GIANC,LOLLI也有效,在这种情况下,我可以将字符串切成3个组,其他情况下,组号应等于用户通过RegExp测试的输入。

我试图在JavaScript中执行类似的操作,但它仅返回最后一个值

 var str = ',GIANC,IGORA';
      var arr = str.match(/^(?:(?:\,([A-Za-z]{5}))?)+$/).slice(1);
      alert(arr);

所以输出是“ IGORA”,而我​​希望它是“ GIANC”“ IGORA”

这是另一个例子

/^([A-Z]{5})(?:(?:\,([A-Za-z]{2}))?)+$/g

regexp的测试可能至少包含5个图表字符串,但也可以将其他5个图表字符串用逗号分隔,以便与输入

IGORA,CIAOA,POPOP

我将有一个["IGORA","CIAOA","POPOP"]

数组

3 个答案:

答案 0 :(得分:1)

您可以在由可选的前逗号或可选的尾随逗号包围的捕获中捕获单词。

您可以测试regex here,?([A-Za-z]+),?

const pattern = /,?([A-Za-z]+),?/gm;
const str = `,IGORA,GIANC,LOLLI`;
let matches = [];

let match;

// Iterate until no match found
while ((m = pattern.exec(str))) {

  // The first captured group is the match
  matches.push(m[1]);
}

console.log(matches);

答案 1 :(得分:0)

这是您要找的吗?

说明:

  

\b单词边界(单词的开头或结尾)

     

\w一个单词([A-z])

     

{5}前5个字符

因此它匹配所有5个字符的单词,但不匹配NANANANA

var str = 'IGORA,CIAOA,POPOP,NANANANA';
var arr = str.match(/\b\w{5}\b/g);
console.log(arr); //['IGORA', 'CIAOA', 'POPOP']

如果您只希望选择用逗号分隔的单词而没有其他内容,则可以像这样测试它们:

  

(?<=,\s*|^)后跟,,后缀任意数量,或为列表中的第一个单词。

     

(?=,\s*|$),后跟,和任意数量的尾部空格,或者是列表中的最后一个单词。

在下面的代码中,拒绝POPOP和MOMMA,因为它们之间没有逗号分隔,而NANANANA失败,因为它不是5个字符。

var str = 'IGORA, CIAOA, POPOP MOMMA, NANANANA, MEOWI';
var arr = str.match(/(?<=,\s*|^)\b\w{5}\b(?=,\s*|$)/g);
console.log(arr); //['IGORA', 'CIAOA', 'MEOWI']

如果逗号后没有空格,只需在\s*(?<=,\s*|^)中都忽略(?=,\s*|$)

答案 2 :(得分:0)

还有其他方法可以执行此操作,但是我发现一种简单的方法是使用replace方法,因为它可以替换所有与该正则表达式匹配的实例。

例如:

var regex = /^(?:(?:\,([A-Za-z]{5}))?)+$/g;
var str = ',GIANC,IGORA';
var arr = [];
str.replace(regex, function(match) {
    arr[arr.length] = match;
    return match;
});
console.log(arr);

此外,在我的代码段中,您可以看到每个字符串中都有一个额外的逗号,可以通过将第5行更改为arr[arr.length] = match.replace(/^,/, '')来解决此问题。