2012-02-14 100 views
3

我有一些奇怪的問題「改進」書籤。 我把這個例子從here - 它需要表達式匹配的頁面上的正則表達式,並強調文本 - 我已經重新格式化它使用JSMin記事本++輕鬆閱讀:兩個正則表達式JavaScript書籤之間的差異

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; 
} 
... 

的首部作品,第二個沒有。當從第二個表達式複製到提示符時,第一個甚至可以工作。

當第二次運行時,瀏覽器會消耗CPU一段時間,然後突出顯示下蹲。第一個是近乎即時的。 IE9/Chrome17/FF10的行爲似乎沒有差異。在第二個中使用新的正則表達式(...)並沒有幫助 - 我使用斜槓符號來保存其餘部分的斜槓,使其不易讀。

會有人願意指出我對我的錯誤嗎?

+0

不確定您的正則表達式是否有效。嘗試'/ \ b(who | who | ... |噁心)\ b/i'(在外面休息,但 - 更重要的是 - 分支周圍的人) – Flambino 2012-02-14 16:50:10

回答

0

你在表達式中忽略了「(」和「)」。 regexp = /(\ bwho \ b | \ bwhom \ b | \ blay \ b | \ blie \ b | \ bmoot \ b | \ bcontinual \ b | \ bcontinuous \ b | \ benvy \ b |

| \ bjealousy \ C | \ benvious \ C | \ bjealous \ C | \ bnor \ C | \ bmay \ C | \ bmight \ C | \ bwhether \ C | \ bfewer \ C | \保佑\ C | \ bdisinterested \ b | \ buninterested \ b | \ b不同於\ b | \ bimpactful \ b | \ baffect \ b | \ beffect \ b | \ birony \ b | \ bironic \ b | \偶然\ b)/ i;

如果你問我爲什麼需要括號,我不知道。更深入的代碼相關的是我的教育猜測。我所做的只是比較原始代碼和代碼之間的不同之處;給定輸入框中輸入表達式的事實。

+1

最近的附錄。我知道爲什麼括號是必要的。你需要像'(.. | .. | .. | ..)'那樣圍繞'或'運算符'|'進行括號。 – 2012-03-03 04:49:47