RegEx用于查找带有字符的单词

时间:2012-03-18 14:20:30

标签: regex

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

考虑以下单词列表:

iris
iridium
initialization

当我正在使用字符时,如何使用正则表达式查找此列表中的单词?我期待正则表达式找到“铱”只是因为它是列表中唯一有两个 i 和一个 u 的单词。

我尝试了什么

我一直在这里和其他地方搜索,但没有遇到任何帮助我。

 [i].*[i].*[u]

按预期匹配铱,而不是虹膜和初始化。但是,字符 i i u 必须在单词中的那个序列中,这可能是也可能不是。所以尝试使用不同的序列

 [u].*[i].*[i]

这与铱不匹配(但是我想要它,铱含有)而且我被困该怎么做才能使它匹配。有什么想法吗?

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

 [t].*[n].*[z].*[t].*[i].*[i]
 [t].*[z].*[n].*[t].*[i].*[i]
 [t].*[z].*[n].*[i].*[t].*[i]
 ..... (long list until)
 [i].*[n].*[i].*[t].*[z].*[t] (the first matching sequence)

有没有办法使用正则表达式来查找单词,而不管字符的顺序如何?

4 个答案:

答案 0 :(得分:0)

我认为有一种方法可以用RegularExpressions来解决这个问题,它不会以一个非常复杂的表达方式结束 - 可能使用LookForward和LookBehind表达式,但我认为如果你只是以编程方式解决这个问题,它可能会更快,更简洁

用空格来填充字符串,然后遍历所有单词并计算字符在单词中出现的实例。为了加快速度,请丢弃长度小于字符数要求的所有单词。

答案 1 :(得分:0)

这是一个学术练习,还是可以使用多个正则表达式?这有什么语言吗?执行所需操作的最简单方法是使用仅与iu匹配的正则表达式,并检查(计数)匹配项。使用python,它可能是一个单行。你在用什么?

你尚未得到的部分是这个词中可能还有其他的我或你。因此,不要在.*上匹配,而是匹配[^iu]

答案 2 :(得分:0)

这就是我要做的事情:

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

编辑:如果您需要任何解释,请与我们联系。

答案 3 :(得分:0)

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

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

以下是它的工作原理:

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



因此,字母x必须在单词中出现n次的正则表达式为(?=(?:[^x\W]*x){n})
那么你要做的就是为每个字母添加这个模式,并在末尾添加\ w +以匹配单词!