Группировка регулярных выражений внутри игнорирующей повторяющейся группы - PullRequest
0 голосов
/ 20 мая 2018

У меня есть следующий текст:

Example 1: 'lun et mer et mar'

Example 2: 'lun. et mer. - mar.'

Example 3: 'lun a ven'

Negative example 4 (must not match): 'sept à juin'

Negative example 5 (must not match): 'foo bar'

Negative example 6 (must not match): '9h30 - 18h'

Я пытаюсь сгруппировать каждое слово, поэтому желаемый результат будет таким:

Example 1: ['lun', 'et', 'mer', 'et', 'mar']

Example 2: ['lun', 'et', 'mer', '-', 'mar']

Example 3: ['lun', 'a', 'ven']

Регулярное выражение, которое я пробовал: здесь :

(?:((lun|mar|mer)\.?\s*(\-|au|a|à|et)?\s*)+)

Но в результате я получаю только последнее слово 'mar', дважды.

Я бы сказал, что у меня есть это проблема, но я попробовал то, что предложила статья, но безуспешно.

Кто-нибудь знает, как решить эту проблему?

ПРИМЕЧАНИЕ Мне нужно, чтобы это было регулярное выражениепотому что я анализирую неизвестный текст, и если есть полное совпадение, я знаю, с какими данными я имею дело.Например, это не должно совпадать:

Mustn't match: 'sept à juin' 

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Может быть, вы можете сделать следующее:

let Example1 = 'lun et mer et mar';
let Example2 = 'lun. et mer. - mar.';
let Example3 = 'lun a ven';
let Example4 = 'sept à juinn';

function format(str){
  str = /(lun|mar|mer)/.test(str) ? str : '';
  return str.split(' ').map(i=>i.replace(/[.]/,'')).filter(j=>j)
}
console.log(format(Example1));
console.log(format(Example2));
console.log(format(Example3));
console.log(format(Example4));
0 голосов
/ 20 мая 2018

Вы можете сделать это без захвата групп, используя флаг g для многократного совпадения:

function words(s) {
  let a = s.match(/[a-z-]+/g);
  console.log(a);
}

words('lun et mer et mar');
words('lun. et mer. - mar.');
words('lun a ven');
0 голосов
/ 20 мая 2018

Просто разделите это регулярное выражение после удаления конечной пунктуации:

/[ ,.]+/

Демонстрация:

var str = "lun. et mer. - mar.";
var words = str.replace(/[ .,]+$/, "").split(/[ ,.]+/);
console.log(words);

Выход:

[
  "lun",
  "et",
  "mer",
  "-",
  "mar"
]
...