如何防止我的正则表达式匹配字符串中的尾随引号?

时间:2011-03-04 21:49:10

标签: regex

我正在重新调整javascript中定义的一些网址:

var x = "http:\/\/example.com\/test.aspx?v=12.1&x=2&p=3";
var y = "http:\/\/example.com\/test.aspx?v=92.1&x=2&p=4";

我的正则表达式捕获域部分,路径和查询字符串进入捕获组非常有效:

(http:\\/\\/example.com\\/)([0-9a-zA-Z-\\\/\._]+)([\?]?)(.+)`

然而,凡士林中的沙子是最后的双引号也是匹配的。如何在结束报价之前停止匹配?

碰巧这是针对IIS7的UrlRwriter所以我不能使用任何代码来删除最终报价。

2 个答案:

答案 0 :(得分:2)

而不是匹配任何一次或多次.+尝试匹配任何不是引用一次或多次:

[^"]+

[]创建一个字符类,'^'表示不是..或否定字符类。这将完全匹配任何不是引用的内容。

答案 1 :(得分:2)

我假设您不允许在网址正文中使用引号,因此您只需将(.+)更改为([^"]+)

修改:我可能需要允许"',因此您可以将上述内容更改为([^"']+)。如果你想更加彻底,你可以选择

([^"']+)(http:\\/\\/example.com\\/)([0-9a-zA-Z-\\\/\._]+)([\?]?)(.+?)\1

...并忽略第一个捕获组。这样,它将所有内容都用到下一个匹配的引用。但这可能是不必要的。我无法想象你想在你的URL字符串中允许'",但是.已经匹配了几个不应该在URL中的字符,所以我以为我会留给你。