我已经做了一些正则表达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/
答案 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)
您只需匹配一个合法值,然后在下一个序列中再次执行此操作,但这次有一个负向预测,以排除您已匹配的内容(您使用反向引用表示)。