有一個正則表達式:正則表達式返回在IE的值,「未定義」在Firefox和Safari /鉻
.*?
(rule1|rule2)
(?:(rule1|rule2)|[^}])*
(它的設計解析CSS文件和「規則」是由JS生成)
當我在IE中嘗試這個時,所有的工作都應該如此。 同上,當我在RegexBuddy或正則表達式教練中嘗試它。
但是,當我在Firefox或Chrome中嘗試它時,結果缺失值。
任何人都可以請解釋一下真正的瀏覽器在想什麼,或者我可以如何實現類似於IE的結果?
要看到這個實際操作,請加載一個頁面,使您可以進行交互式測試,例如W3Schools嘗試編輯器。
下面介紹了可在被粘貼的來源: http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_regexp_exec
<html>
<body>
<script type="text/javascript">
var str="#rot { rule1; rule2; }";
var patt=/.*?(rule1|rule2)(?:(rule1|rule2)|[^}])*/i;
var result=patt.exec(str);
for(var i = 0; i < 3; i++) document.write(i+": " + result[i]+"<br>");
</script>
</body>
</html>
這裏是在IE中的輸出:
0: #rot { rule1; rule2;
1: rule1
2: rule2
以下是在Firefox和鉻的輸出:
0: #rot { rule1; rule2;
1: rule1
2: undefined
當我嘗試使用string.match相同時,我得到一個數組在所有瀏覽器中都未定義,包括IE。
var str="#rot { rule2; rule1; rule2; }";
var patt=/.*?(rule1|rule2)(?:(rule1|rule2)|[^}])*/gi;
var result=str.match(patt);
for(var i = 0; i < 5; i++) document.write(i+": "+result[i]+"<br>");
據我所知,問題是最後一個非捕獲括號。
當我刪除它們時,結果是一致的跨瀏覽器 - match()獲取結果。
然而,確實從最後括號捕獲,在所有瀏覽器,下面的例子:
<script>
var str="#rot { rule1; rule2 }";
var patt=/.*?(rule1|rule2)(?:(rule1 |rule2)|[^}])*/gi;
var result=patt.exec(str);
for(var i =0; i < 3; i++) document.write(i+": "+result[i]+"<br>");
</script>
注意到我在第二個正則表達式增加了空間的模式。如果我在第二正則表達式的任何負面字符添加到字符串
這同樣適用:
var patt=/.*?(rule1|rule2)(?:(rule1[^1]|rule2[^1])|[^}])*/gi;
什麼髒話是怎麼回事?
我嘗試過的所有其他字符串都會導致第一組非捕獲。 任何幫助,非常感謝!
編輯: 在Mathhew的建議下,代碼被縮短了,許多小時的研究已經完成。
標題已更改爲使線程更容易找到。
我已經標記Mathew的答案是正確的,因爲它很好的研究和描述。
我在下面的回答(寫在Mathew修訂他之前)用更簡單和更直接的方式陳述邏輯。
我建議您嘗試將其濃縮爲更小,更簡單的示例,該示例仍然表現出相同的差異。你甚至可以在這個過程中解決問題。 – 2010-10-27 22:24:19
完成。現在更奇怪,因爲較小的代碼比原始代碼更不一致。 – SamGoody 2010-10-28 08:06:05