Есть ли более умный способ написать этот RegExp? - PullRequest
0 голосов
/ 28 сентября 2019

Рассмотрим это регулярное выражение: /^(B|C|AB|AC|BC|ABC)$/.Он принимает только строки, содержащие B или C (включительно или), необязательно с предшествующим A.Хотя он работает просто отлично, перечисляя по очереди все принятые строки, это явно не очень масштабируемое решение, особенно учитывая, что A, B и C могут заменять более длинные фразы.Мой вопрос: есть ли способ написать эквивалентное регулярное выражение, в котором A, B и C появляются только один раз?

Ответы [ 4 ]

1 голос
/ 28 сентября 2019

/^(B|C|AB|AC|BC|ABC)$/

прямо эквивалентно

/^(A(?:BC?|C)|BC?|C)$/

, в котором последнее примерно в 10 раз быстрее.

0 голосов
/ 28 сентября 2019

Вы можете использовать

^A?(BC?|C)$

По сравнению с выражением в вашем вопросе это соответствует

BC AB AC ABC

Но несоответствует

A ACB AAB ABA AAC ABCC

0 голосов
/ 28 сентября 2019

/^(B|C|AB|AC|BC|ABC)$/

Поскольку A является необязательным префиксом, мы можем вынуть его и использовать ?:

/^A?(B|C|BC)$/

Если вы хотитечтобы избавиться от дублирования B и C, может быть способ с регулярным выражением подпрограмм .К сожалению, они не работают в JS!Как насчет постобработки после ложного совпадения?

/^A?(B?)(C?)$/

Затем убедитесь, что хотя бы одна из двух групп захвата соответствует:

let re = /^A?(B?)(C?)$/;
for (let str of [
  "A",
  "B",
  "C",
  "AB",
  "AC",
  "ABC",
  "BAC",
  "CBA",
  "AAB",
  "ABBC"
]) {
  let groups = str.match(re);
  let match = (!!groups && (!!groups[1] || !!groups[2]));
  console.log(str, match);
}
0 голосов
/ 28 сентября 2019

Вот и мы!

var regex = RegExp('^A{0,1}(BC{0,1}|C)$');
// Good
console.log('GOOD');
console.log(regex.test('AB'));
console.log(regex.test('AC'));
console.log(regex.test('ABC'));
console.log(regex.test('B'));
console.log(regex.test('C'));

// Wrong
console.log('WRONG');
console.log(regex.test('A'));
console.log(regex.test('CB'));
console.log(regex.test('ACB'));
console.log(regex.test('CAB'));
console.log(regex.test('ABX'));
console.log(regex.test('Z'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...