Регулярные выражения Javascript: как соответствовать ТОЛЬКО заданным символам? - PullRequest
1 голос
/ 28 мая 2010

Я пытаюсь использовать регулярное выражение типа /[computer]{3,8}/, чтобы получить любые слова, содержащие только буквы в компьютере длиной от 3 до 8 букв. Это регулярное выражение вместо этого захватывает все слова, содержащие ЛЮБЫЕ буквы в [компьютере]. Я смотрю на примеры регулярных выражений, но не могу понять ...

Как мне изменить это регулярное выражение для захвата слов, содержащих ТОЛЬКО буквы в компьютере (длиной от 3 до 8)?

Вот несколько примеров того, что я хочу сопоставить, используя базовое слово «компьютер»:

пут, швабра, вырезать, термин, мило, мама, удар, немой

(конечный результат - использовать каждую букву только один раз, но я могу обойтись без этой функции)

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

Совпадение границ слов на краю вашего регулярного выражения.

/\b[computer]{3,8}\b/
0 голосов
/ 29 мая 2010

Я думаю, что-то вроде этого - то, что вы хотите:

<script>

var s = "pu put puut mutep computer comp coomp retupmoc compux xputer";
s = s.replace(/\b((?!\w*(\w)\w*\2)[computer]{3,8})\b/g, "[$1]");
document.write(s);

</script>

Это печатает:

pu [put] puut [mutep] [computer] [comp] coomp [retupmoc] compux xputer

Таким образом, он соответствует целым словам, которые [computer]{3,8}, но без повторяющихся символов.

Сопоставление без повторения выполняется с использованием негативного взгляда на этот шаблон:

\w*(\w)\w*\2

Этот шаблон пытается найти слово, содержащее повторяющийся символ. Он делает это, захватывая персонажа, а затем проверяет, не появится ли он снова позже, позволяя \w* между ними.

Смотри также

Похожие вопросы

0 голосов
/ 29 мая 2010

Вторая часть вашего вопроса закончилась использованием довольно много кода это было бы проще, но было бы интереснее создать метод для поиска в любой строке текста компонентов любого слова, которое вы ее кормите.

function wordsfrom(s1, str){
    var i, tem, temp, s1= s1.toLowerCase(),
    rx= RegExp('\\b(['+s1+']{3,'+s1.length+'})\\b','gi'),
    M= str.match(rx) || [];

    return M.testEach(function(itm){
        tem= itm.toLowerCase().split('');
        temp= s1.split('');
        while(tem.length){
            ax= temp.indexAt(tem.pop());
            if(ax== -1) return false;
            temp.splice(ax, 1);
        }
        return true;
    });
}



var s1= 'cut pat, rope, computers, putt, compote, come, put, mop, dog, comute';
alert(wordsfrom('computer', s1));

/*  returned value: (Array)
cut,rope,come,put,mop,comute
*/

При этом используется пара общих методов Array, полезных для IE и работающих в других.

Замените тем, что вы будете использовать для метода indexOf и фильтра.

Array.prototype.testEach= function(fun){
    var A= [], i= 0, itm, L= this.length;
    if(typeof fun== "function"){
        while(i < L){
            itm= this[i];
            if(fun(itm, i++)) A[A.length]= itm;
        }
    }
    return A;
}
Array.prototype.indexAt= function(what){
    var L= this.length;
    while(L) if(this[--L]=== what) return L;
    return -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...