我在这里找到了许多问题的答案,但这次我被困住了。我看了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)
有没有办法使用正则表达式来查找单词,而不管字符的顺序如何?
答案 0 :(得分:0)
我认为有一种方法可以用RegularExpressions来解决这个问题,它不会以一个非常复杂的表达方式结束 - 可能使用LookForward和LookBehind表达式,但我认为如果你只是以编程方式解决这个问题,它可能会更快,更简洁
用空格来填充字符串,然后遍历所有单词并计算字符在单词中出现的实例。为了加快速度,请丢弃长度小于字符数要求的所有单词。
答案 1 :(得分:0)
这是一个学术练习,还是可以使用多个正则表达式?这有什么语言吗?执行所需操作的最简单方法是使用仅与i
或u
匹配的正则表达式,并检查(计数)匹配项。使用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 +以匹配单词!