2012-02-01 125 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