正则表达式在一个忽略重复组内部分组

时间:2018-05-20 02:56:44

标签: javascript regex regex-group regex-greedy

我有以下文字:

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']

我尝试的正则表达式是here

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

但是,结果,我只得到了最后一个字,并且两次。

我会说我有this问题,但我尝试了文章提出的建议而没有成功。

有人知道如何解决这个问题吗?

注意我需要这是一个正则表达式,因为我正在解析一个未知文本,如果有完全匹配,我知道我用什么样的数据。处理。 例如,这不能匹配:

Mustn't match: 'sept à juin' 

3 个答案:

答案 0 :(得分:0)

在删除尾随标点后,只需拆分此正则表达式:

/[ ,.]+/

演示:



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




输出:

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

答案 1 :(得分:0)

可能你可以做到以下几点:



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));




答案 2 :(得分:0)

您可以在不使用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');