Regex 正则表达式查找带有字符的单词

Regex 正则表达式查找带有字符的单词,regex,Regex,我在这里找到了很多问题的答案,但这次我被卡住了。我已经看了100个问题,但还没有找到解决我问题的答案,所以我希望你的帮助:D 考虑到下列词语: iris iridium initialization 当我使用字符u、I、I查找时,如何使用正则表达式查找此列表中的单词?我希望正则表达式能够找到“iridium”,因为它是列表中唯一有两个I和一个u的单词 我试过的 我一直在这里和其他地方搜索,但没有找到任何对我有帮助的 [i].*[i].*[u] 和预期的一样,匹配铱,而不是iris或初始化。

我在这里找到了很多问题的答案,但这次我被卡住了。我已经看了100个问题,但还没有找到解决我问题的答案,所以我希望你的帮助:D

考虑到下列词语:

iris
iridium
initialization
当我使用字符uII查找时,如何使用正则表达式查找此列表中的单词?我希望正则表达式能够找到“iridium”,因为它是列表中唯一有两个I和一个u的单词

我试过的 我一直在这里和其他地方搜索,但没有找到任何对我有帮助的

 [i].*[i].*[u]
和预期的一样,匹配铱,而不是iris或初始化。但是,字符iiu必须在单词中按该顺序排列,情况可能是这样,也可能不是这样。所以试着用一个不同的序列

 [u].*[i].*[i]
这与铱不匹配(但我希望它匹配,铱包含uII),我一直在思考如何使其匹配。有什么想法吗

我知道我可以尝试所有序列(在上面的示例中,它将是iiuiuiuii),但当我寻找更多字符时,这会变得混乱(比如6,tnztii,这将匹配初始化)


有没有一种方法可以使用正则表达式来查找单词,而不考虑字符的顺序?

我认为没有一种方法可以用正则表达式来解决这个问题,正则表达式不会以一个非常复杂的表达式结尾-可能是用前向和后向表达式,但我认为,如果你只是简单地用编程的方式解决这个问题,它可能会更快,也不会那么混乱


用空格将字符串切碎,然后遍历所有单词,并计算您的字符在该单词中出现的实例。要加快速度,请丢弃所有长度小于字符数要求的单词。

这是一项学术练习,还是可以使用多个正则表达式?有没有一种语言围绕着这个?最简单的方法是使用一个只匹配
i
u
的regexp,然后检查(计数)匹配项。使用python,它可以是一行程序。你在用什么


你还没有想到的是,这个词中可能还有其他的i或u。因此,与其在
*
上匹配,不如在
[^iu]

上匹配,下面是我要做的:

Array.prototype.findItemsByChars = function(charGroup) {
    console.log('charGroup:',charGroup);
    charGroup = charGroup.toLowerCase().split('').sort().join('');
    charGroup = charGroup.match(/(.)\1*/g);
    for (var i = 0; i < charGroup.length; i++) {
        charGroup[i] = {char:charGroup[i].substr(0,1),count:charGroup[i].length};
        console.log('{char:'+charGroup[i].char+' ,count:'+charGroup[i].count+'}');
    }
    var matches = [];
    for (var i = 0; i < this.length; i++) {
        var charMatch = 0;
        //console.log('word:',this[i]);
        for (var j = 0; j < charGroup.length; j++) {
            try {
                var count = this[i].match(new RegExp(charGroup[j].char,'g')).length;
                //console.log('\tchar:',charGroup[j].char,'count:',count);
                if (count >= charGroup[j].count) {
                    if (++charMatch == charGroup.length) matches.push(this[i]);
                }
            } catch(e) { break };
        }
    }
    return matches.length ? matches : false;
};

var words = ['iris','iridium','initialization','ulisi'];
var matches = words.findItemsByChars('iui');
console.log('matches:',matches);
Array.prototype.findItemsByChars=函数(charGroup){
log('charGroup:',charGroup);
charGroup=charGroup.toLowerCase().split(“”).sort().join(“”);
charGroup=charGroup.match(/()\1*/g);
对于(var i=0;i=字符组[j]。计数){
如果(++charMatch==charGroup.length)匹配.push(这个[i]);
}
}捕获(e){break};
}
}
返回matches.length?匹配:false;
};
var words=['iris','iridium','initialization','ulisi'];
var matches=words.findItemsByChars('iui');
log('matches:',matches);

编辑:如果您需要任何解释,请告诉我。

我知道这是一篇非常古老的帖子,但我发现这个话题非常有趣,我想有一天人们可能会寻找类似的答案。

因此,我们的目标是以任何顺序将所有单词与一组特定的字符进行匹配。使用lookaheads有一种简单的方法可以做到这一点:
\b(?=(?:[^i\W]*i{2})(?=[^u\W]*u)\W+\b


它是如何工作的:

对于要匹配的每个字母,我们使用一个前瞻
(?=…)
在这里,我们放置
[^x\W]*x
,其中x是必须出现的字母。
然后我们让这个模式出现n次,其中n是x必须出现在th单词中的次数,使用
(?:…){n}


字母x必须在单词中出现n次的结果正则表达式是
(?=(?:[^x\W]*x){n}


然后,您只需为每个字母添加此模式,并在末尾添加\w+,以匹配单词

正则表达式在这方面不是很好。您真的需要它们吗?您可以分别匹配字符,并使用编程逻辑验证所有字符是否匹配。
Array.prototype.findItemsByChars = function(charGroup) {
    console.log('charGroup:',charGroup);
    charGroup = charGroup.toLowerCase().split('').sort().join('');
    charGroup = charGroup.match(/(.)\1*/g);
    for (var i = 0; i < charGroup.length; i++) {
        charGroup[i] = {char:charGroup[i].substr(0,1),count:charGroup[i].length};
        console.log('{char:'+charGroup[i].char+' ,count:'+charGroup[i].count+'}');
    }
    var matches = [];
    for (var i = 0; i < this.length; i++) {
        var charMatch = 0;
        //console.log('word:',this[i]);
        for (var j = 0; j < charGroup.length; j++) {
            try {
                var count = this[i].match(new RegExp(charGroup[j].char,'g')).length;
                //console.log('\tchar:',charGroup[j].char,'count:',count);
                if (count >= charGroup[j].count) {
                    if (++charMatch == charGroup.length) matches.push(this[i]);
                }
            } catch(e) { break };
        }
    }
    return matches.length ? matches : false;
};

var words = ['iris','iridium','initialization','ulisi'];
var matches = words.findItemsByChars('iui');
console.log('matches:',matches);