2012-02-01 45 views
-1

我有以下的javascript代碼:JavaScript的正則表達式無效量詞錯誤

if (url.match(/?rows.*?(?=\&)|.*/g)){ 
     urlset= url.replace(/?rows.*?(?=\&)|.*/g,"rows="+document.getElementById('rowcount').value); 
}else{ 
    urlset= url+"&rows="+document.getElementById('rowcount').value; 
} 

我得到的錯誤invalid quantifier/?rows.*?...。使用測試串

?srt=acc_pay&showfileCL=yes&shownotaryCL=yes&showclientCL=no&showborrowerCL=yes&shownotaryStatusCL=yes&showclientStatusCL=yes&showbillCL=yes&showfeeCL=yes&showtotalCL=yes&dir=asc&closingDate=12/01/2011&closingDate2=12/31/2011&sort=notaryname&pageno=0&rows=anything&Start=0','bodytable','xyz')

在此字符串上http://www.pagecolumn.com/tool/regtest.htm測試時,這個相同的正則表達式的工作,上述正則表達式應該匹配:

rows=anything

其實我也不需要/?得到它的工作,但如果我沒有把它放入我的JavaScript,它的行爲就像它甚至不是正則表達式...我正確地使用正則表達式時期,所以這一個讓我很困惑。而這個錯誤是我在Firefox的錯誤控制檯中遇到的唯一錯誤。

編輯

使用該鏈接我張貼以上,似乎導致/嘗試匹配的實際正斜槓,而不是僅僅將代碼標記爲正則表達式語句的開始。所以?就在那裏,所以如果它不匹配/任何東西,它仍然繼續。

解決方案

好了,到了最後,我有我的正則表達式改成這樣:

/rows=.*(?=\&?)/g

此相匹配的單詞「行=」後面是什麼,直到它擊中了一個符號或用完文字。

+0

什麼是你期望領先的「?」意思是? – Pointy 2012-02-01 22:24:04

+0

我正在使用它,即使'/'不匹配任何東西,它也不會返回false。 – James 2012-02-01 22:45:46

+0

那麼你想把其餘的正則表達式放在括號中,並把「?」 **之後**,而不是之前。量詞總是在他們所指的事物之後出現**。 – Pointy 2012-02-01 22:49:58

回答

2

regtest.htm產生

new RegExp("?rows.?(?=\&)|.", "") returned a SyntaxError: invalid quantifier

你把該網站不應該對正則表達式的分隔符/的價值,所以把在?rows.*?(?=\&)|.*,它顯示了同樣的問題。您的JavaScript代碼應該看起來像

re = /rows.*?(?=\&)|.*/g; 

或類似的(但這是一個毫無意義的正則表達式,因爲它匹配所有內容)。如果你不能修復它,請描述你想匹配,並顯示你的JavaScript什麼

+0

是的,這就是Pointy在評論中所說的。我認爲這是我的問題。在線正則表達式測試人員讓我感到困惑。如果他們沒有發表他們的答案,我只會將其標記爲答案。但是如果他們這樣做了,我必須先標記他們,因爲他們在技術上首先回答。不過謝謝。 – James 2012-02-01 23:25:08

4

你需要逃避第一個?,因爲它在正則表達式中有特殊的含義。

/\?rows.*?(?=\&)|.*/g 
// ^---escaped 
+0

我不希望它逃脫。我現在有它,因爲沒有第一個'/',腳本不會將它識別爲正則表達式。所以我添加了'?',以便它在發現0次時仍然有效。我不是想要匹配字符串中的實際問號。不過謝謝。 – James 2012-02-01 22:45:13

+0

@詹姆斯:你說的是第一個'/',對吧?這不是正則表達式本身的一部分。這只是用於創建正則表達式的文字符號的一部分。如果你希望它在找到0項時工作,那麼爲什麼要使用正則表達式呢?我認爲你需要退後一步,描述你實際想要達到的目標。 – 2012-02-01 22:51:41

+0

@upvoter:這個迴應沒有回答這個問題! – Borodin 2012-02-01 23:19:20

0

你可能會考慮重構你的代碼看起來像這樣:

var url = "sort=notaryname&pageno=0&rows=anything&Start=0" 
var rowCount = "foobar"; 
if (/[\?\&]rows=/.test(url)) 
{ 
    url = url.replace(/([\?\&]rows=)[^\&]+/g,"$1"+rowCount); 
} 
console.log(url); 

輸出

sort=notaryname&pageno=0&rows=foobar&Start=0

相關問題