Различия между двумя регулярными выражениями JavaScript - PullRequest
3 голосов
/ 14 февраля 2012

У меня странные проблемы с «улучшением» букмарклета.Я взял этот пример из здесь - он принимает регулярное выражение и выделяет текст на странице, соответствующий выражению - я переформатировал его для удобства чтения с помощью JSMin для Notepad ++:

javascript : (function () {
var count = 0,
text,
regexp;
text = prompt("Search regexp:", "");
if (text == null || text.length == 0)
    return;
try {
    regexp = new RegExp("(" + text + ")", "i");
} catch (er) {
    alert("Unable to create regular expression using text '" + text + "'.\n\n" + er);
    return;
}
function searchWithinNode(node, re) {
    var pos,
    skip,
    spannode,
    middlebit,
    endbit,
    middleclone;
    skip = 0;
    if (node.nodeType == 3) {
        pos = node.data.search(re);
        if (pos >= 0) {
            spannode = document.createElement("SPAN");
            spannode.style.backgroundColor = "yellow";
            middlebit = node.splitText(pos);
            endbit = middlebit.splitText(RegExp.$1.length);
            middleclone = middlebit.cloneNode(true);
            spannode.appendChild(middleclone);
            middlebit.parentNode.replaceChild(spannode, middlebit);
            ++count;
            skip = 1;
        }
    } else if (node.nodeType == 1 && node.childNodes && node.tagName.toUpperCase() != "SCRIPT" && node.tagName.toUpperCase != "STYLE") {
        for (var child = 0; child < node.childNodes.length; ++child) {
            child = child + searchWithinNode(node.childNodes[child], re);
        }
    }
    return skip;
}
window.status = "Searching for " + regexp + "...";
searchWithinNode(document.body, regexp);
window.status = "Found " + count + " match" + (count == 1 ? "" : "es") + " for " + regexp + ".";})();

Вот мое сделанное на заказ улучшение первых 10 строк для выделения одним щелчком для:

javascript : (function () {
var count = 0,
regexp;
try {
    regexp = /\bwho\b|\bwhom\b|\blay\b|\blie\b|\bmoot\b|\bcontinual\b|\bcontinuous\b|\benvy\b|\bjealousy\b|\benvious\b|\bjealous\b|\bnor\b|\bmay\b|\bmight\b|\bwhether\b|\bfewer\b|\bless\b|\bdisinterested\b|\buninterested\b|\bdifferent than\b|\bimpactful\b|\baffect\b|\beffect\b|\birony\b|\bironic\b|\bnauseous\b/i;
} catch (er) {
    alert("Unable to create regular expression\n\n" + er);
    return;
}
...

Первое работает, второе - нет.Первое даже работает при копировании выражения из второго в приглашение.

При втором запуске браузер некоторое время потребляет процессор, а затем подсвечивает его.Первое почти мгновенно.Поведение не похоже на IE9 / Chrome17 / FF10.Использование нового Regex (...) во втором не помогает - я использую нотацию с косой чертой, чтобы избавить от необходимости двойной косой черты, делая ее менее читабельной.

Кто-нибудь захочет указать мнек моей ошибке?

1 Ответ

0 голосов
/ 16 февраля 2012

вы пропустили "(" и ")" в своем выражении.

Это работает: regexp = / (\ bwho \ b | \ bwhom \ b | \ blay \ b | \ blie \ b | \ bmoot \ b | \ bcontinual \ b | \ bcontinuous \ b | \ benvy \ b | \ bjealousy \ Ь | \ benvious \ Ь | \ bjealous \ Ь | \ bnor \ Ь | \ bmay \ Ь | \ bmight \ Ь | \ bwhether \ Ь | \ bfewer \ Ь | \ благословить \ Ь | \ bdisinterested \ б | \ buninterested \ b | \ b отличается от \ b | \ bimpactful \ b | \ baffect \ b | \ beffect \ b | \ birony \ b | \ bironic \ b | \ bnauseous \ b) / i;

Если вы спросите меня, зачем нужны скобки, я не знаю. Связанный с кодом ниже по течению мой образованный предположение. Все, что я сделал, это сравнил то, что отличалось между исходным кодом и вашим кодом; учитывая тот факт, что выражение работало при вводе в поле ввода.

...