Регулярное выражение: соответствует, если гласные встречаются в слове по порядку (aeiou), и не совпадает, если есть символ, отличный от символа - PullRequest
3 голосов
/ 18 мая 2019

Я пытаюсь найти соответствие, если слово имеет aeiou, и оно должно быть в порядке aeiou. Также не должно совпадать, если есть символ, который не является словом. Например:

Match:

cabeilous

Не соответствует:

sacrilegious 
jeious 
cabeil-ous

Это то, что я имею до сих пор:

.a[^e]*e[^i]*i[^o]*o[^u]*u.

это соответствует sacrilegious.

Ответы [ 3 ]

1 голос
/ 18 мая 2019
/^[^\Waeiou]*a[^\Waeiou]*e[^\Waeiou]*i[^\Waeiou]*o[^\Waeiou]*u[^\Waeiou]*$/

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

const pattern = /^[^\Waeiou]*a[^\Waeiou]*e[^\Waeiou]*i[^\Waeiou]*o[^\Waeiou]*u[^\Waeiou]*$/;

[
  "cabeilous",    // yep
  "sacrilegious", // nope
  "jeious",       // nope
  "cabeil-ous",   // nope
  "aaeiou",       // nope
  "aeeiou",       // nope
  "aeiiou",       // nope
  "aeioou",       // nope
  "aeiouu",       // nope
].forEach(test => console.log(test, pattern.test(test)));

const patternWithReps = /^[^\Waeiou]*a[^\Weiou]*e[^\Waiou]?i[^\Waeou]*?o[^\Waeiu]*?u[^\Waeio]*$/;

console.log("\n~~ with repetition: ~~");

[
  "cabeilous",    // yep
  "sacrilegious", // nope
  "jeious",       // nope
  "cabeil-ous",   // nope
  "aaeiou",       // yep
  "aeeiou",       // yep
  "aeiiou",       // yep
  "aeioou",       // yep
  "aeiouu",       // yep
].forEach(test => console.log(test, patternWithReps.test(test)));
1 голос
/ 18 мая 2019

Это выражение может помочь вам передать желаемый вывод и не выполнить другие:

^([a-z]+)?(?:[a-z]*a(?:[a-z]*e(?:[a-z]*i(?:[a-z]*o(?:[a-z]*u)))))([a-z]+)?$

Здесь мы можем использовать послойную архитектуру для проверки каждой буквы по порядку, затем мы можем добавить списоксимволов для тех, кого мы хотим иметь за этим.Я только что предположил, что [a-z] может быть желаемым списком char.

enter image description here

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражения в regex101.com .

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

Демонстрация JavaScript для групп захвата

const regex = /^([a-z]+)?(?:[a-z]*a(?:[a-z]*e(?:[a-z]*i(?:[a-z]*o(?:[a-z]*u)))))([a-z]+)?$/gm;
const str = `aeiou
cabeilous
zaaefaifoafua
sacrilegious 
jeious 
cabeil-ous`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
1 голос
/ 18 мая 2019

Вы должны исключить все остальные гласные в каждом отрицании, если вы действительно этого хотите.

...