如何找到随机顺序的单词组(只有一组单词没有其他单词)?

时间:2017-04-16 14:07:07

标签: regex regex-lookarounds

我已经做了一些正则表达3个小时试图解决这个问题。

我正在尝试创建一个正则表达式,我可以按任意顺序找到一组特定的单词或数字,但除非是所选的单词或数字,否则该组不能包含其他单词或数字。标点符号和空格很好

示例:

我要搜索的字词为one,three,four

one,three,four apple is red.应匹配

four, three, one orange is orange.应匹配

one,four,three the sky is blue.应匹配

one,two,four,three不应匹配 因为两个是在一组词之间

four,one,eight,green,three也不是因为八和绿色在所选单词组之间

我做了一些研究,发现如果一个陈述有任何顺序的一组单词,有一种方法可以匹配

Regex: I want this AND that AND that... in any order

唯一的问题是,如果我将一个不属于选定组的单词放在也将被视为匹配的组之间。我不希望这样。

所以我做了一些更多的研究,并找到了如何选择特定单词并找到了这个

https://superuser.com/questions/903168/how-should-i-write-a-regex-to-match-a-specific-word

当允许选择的其中一个单词时,它可以工作,如下所示,

regex = (?:^|\W)one(?:$|\W)

我把“一个”发现了一个

我把“三二四一”,它也找到一个

但是当我把两个表达放在一起时。我明白了

^(?:^|\W)one(?:$|\W)(?:^|\W)three(?:$|\W)(?:^|\W)four(?:$|\W).*$

但它什么都没找到,我做错了什么?

三二四,一无所获

我使用的网站是http://regexr.com/

2 个答案:

答案 0 :(得分:0)

根据你评论的内容是分隔符始终是逗号,你可以使用负面预测断言来防止超过3 ,如果存在如:

^\w+\s*(.)\s*\w+\s*\1\s*\w+(?:(?!\1).)*$

这里我通过使用capture-group来获取分隔符,可以直接使用它:

^\w+\s*,\s*\w+\s*,\s*\w+(?:(?!,).)*$

或:

使用字符串文字:

^(?:one|three|four)\s*,\s*(?:one|three|four)\s*,\s*(?:one|three|four).*$

const regex = /^(?:one|three|four)\s*,\s*(?:one|three|four)\s*,\s*(?:one|three|four).*$/gm;
const str = `one,three,four apple is red.       match

four, three, one orange is orange. match

one,four,three the sky is blue.    match

one,two,four,three not match

four,one,eight,green,three no match`;
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 :(得分:0)

交替|和带有反向引用(?!..)的否定前瞻\n的组合应该这样做:

(one|three|four)\s*,\s*(?!\1)(one|three|four)\s*,\s*(?!\1|\2)(one|three|four)

您只需匹配一个合法值,然后在下一个序列中再次执行此操作,但这次有一个负向预测,以排除您已匹配的内容(您使用反向引用表示)。

https://regex101.com/r/FwzBY9/1/