Как нарезать необязательные аргументы в RegEx? - PullRequest
1 голос
/ 16 мая 2019

На самом деле у меня есть следующее выражение 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);

Итак, вывод «ИГОРА», а я бы хотел «ГИАНК» «ИГОРА»

Вот еще один пример

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

тест регулярного выражения может иметь как минимум 5 строк диаграммы, но также может иметь другие 5 строк диаграммы, разделенных запятой, поэтому от ввода

ИГОРА, CIAOA, POPOP

Я бы имел массив ["IGORA","CIAOA","POPOP"]

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Вы можете захватить слова в захвате, окруженные необязательной предшествующей запятой или необязательной запятой.

Здесь вы можете проверить регулярное выражение : ,?([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);
0 голосов
/ 16 мая 2019

Есть и другие способы сделать это, но я обнаружил, что одним из простых способов является использование метода 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(/^,/, '').

0 голосов
/ 16 мая 2019

Это то, что вы ищете?

Объяснение:

\b граница слова (начало или конец слова)

\wслово ([Az])

{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*|^) перед, с любым числом завершающих пробелов, OR - первое слово в списке.

(?=,\s*|$), за которым следует ,, а любое количество завершающих пробелов OR - последнее слово в списке.

В следующем коде 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*|$).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...