使用正则表达式在URL中查找带符号的短语

时间:2013-06-02 12:05:59

标签: regex

我有几个页面与当前网址:

onclick="location.href='https://www.mydomain.com/shop/bags

在每个网址的末尾都有这样的内容:

?cid=Black'"
or 
?cid=Beige'"
or 
?cid=Green'"

我需要的是正则表达式,以便在每个网址中找到?cid=,然后替换从?cid=到结尾'的所有内容

我有这个:     .?cid=.*?'

这会在每行代码中找到?cid=的出现。我只希望它在onclick="location.href='https://www.mydomain.com/shop/bags

中查找事件

有人为此得到任何解决方案吗?

更新 抱歉最初的困惑。我正在使用这个程序http://www.araxis.com/replace-in-files/index-eur.html,它允许使用正则表达式来查找元素。我认为它说它允许PERL风格的正则表达式。

由于

3 个答案:

答案 0 :(得分:0)

您可以使用lookaround语法匹配网址前面的?cid=something,后跟'

这种模式应该有效:

(?<=\Qhttps://www.mydomain.com/shop/bags\E)\?cid=[^']++(?=')

如果您使用替代品替换该模式,则会替换从?cid'的整个位。

以下是Java中的一个示例(忽略略有不同的语法):

public static void main(String[] args) {
    final String[] in = {
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Black'",
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Beige'",
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Green'"
    };
    final Pattern pattern = Pattern.compile("(?<=\\Qhttps://www.mydomain.com/shop/bags\\E)\\?cid=[^']++(?=')");
    for(final String string : in) {
        final Matcher m = pattern.matcher(string);
        final String replaced = m.replaceAll("SOMETHING_ELSE");
        System.out.println(replaced);
    }
}

输出

onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'
onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'
onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'

显然,这假设您的工具支持环视。

如果你只是直接使用Perl而不是通过你的魔法工具

,这肯定会有效
perl -pi -e '/s/(?<=\Qhttps://www.mydomain.com/shop/bags\E)\?cid=[^\']++(?=\')/SOMETHING_ELSE/g' *some_?glob*.pattern

修改

另一个想法是使用捕获组和反向引用,替换

(\Qhttps://www.mydomain.com/shop/bags\E)\?cid=[^']++

使用

$1SOMETHING_ELSE

Java中的另一个测试用例:

public static void main(String[] args) {
    final String[] in = {
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Black'",
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Beige'",
        "onclick=\"location.href='https://www.mydomain.com/shop/bags?cid=Green'"
    };
    final Pattern pattern = Pattern.compile("(\\Qhttps://www.mydomain.com/shop/bags\\E)\\?cid=[^']++");
    for(final String string : in) {
        final Matcher m = pattern.matcher(string);
        final String replaced = m.replaceAll("$1SOMETHING_ELSE");
        System.out.println(replaced);
    }
}

输出:

onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'
onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'
onclick="location.href='https://www.mydomain.com/shop/bagsSOMETHING_ELSE'

答案 1 :(得分:0)

查找

(onclick="location.href='https://www.mydomain.com/shop/bags.*?)\?cid=.*?'

替换

$1something'

答案 2 :(得分:-1)

你可以使用这种模式

\?cid=[^']*

我们的想法是使用一个排除最终简单引号的字符类,然后避免使用惰性量词。

注意:如果支持,您可以使用占有量词来减少正则表达式引擎的工作:

\?cid=[^']*+