【问题标题】:ReplaceFirst with Regular ExpressionReplaceFirst 用正则表达式
【发布时间】:2013-08-19 19:31:35
【问题描述】:

假设我有一个字符串

String link = "www.thisisalink.com/tick1=@tick1@&tick2=@tick2@&tick3=@tick3@&tick4=@tick4@";

那我就可以用了

link = replaceFirst("(.+)=@\\1@", "");

实现它

link = "www.thisisalink.com/&tick2=@tick2@&tick3=@tick3@&tick4=@tick4@";

但我想循环遍历字符串,以获取已替换的内容并将其保存在其他位置,例如链表或数组...结果将是:

String[] result = ["tick1=@tick1@", "tick2=@tick2@", "tick3=@tick3@", "tick4=@tick4@"];
String link = "www.thisisalink.com/&&&";

但是我该怎么做呢?我尝试循环使用

while (link.matches("(.+)=@\\1@")){}

这没用。

【问题讨论】:

    标签: java regex string replace


    【解决方案1】:

    这会产生你想要的字符串:

    public static void main(String[] args)
    {
        final String link = "www.thisisalink.com/tick1=@tick1@&tick2=@tick2@&tick3=@tick3@&tick4=@tick4@";
        final int index = link.indexOf("/") + 1;
    
        final String[] result = link.substring(index).split("&");
        final String newLink = link.substring(0, index) + repeat("&", result.length -1);
        System.out.println(newLink);
        for(final String tick : result)
        {
            System.out.println(tick);
        }
    }
    
    private static String repeat(final String toRepeat, final int repetitions)
    {
        final StringBuilder sb = new StringBuilder(repetitions);
        for(int i = 0; i < repetitions; i++)
        {
            sb.append(toRepeat);
        }
        return sb.toString();
    }
    

    生产:

    www.thisisalink.com/&&&
    tick1=@tick1@
    tick2=@tick2@
    tick3=@tick3@
    tick4=@tick4@
    

    【讨论】:

    • 谢谢您,但我更喜欢其他解决方案...不过感谢您的努力。
    【解决方案2】:

    您可以使用Pattern Matcher 类来遍历您的字符串以查找与您的正则表达式匹配的子字符串。然后要替换已建立的子字符串,您可以使用appednReplacementappendTail。要获得建立匹配,您可以使用 Matcher 实例中的 group()

    这里有一些你想要的东西

    String link = "www.thisisalink.com/tick1=@tick1@&tick2=@tick2@&tick3=@tick3@&tick4=@tick4@";
    
    StringBuffer sb = new StringBuffer();
    
    Pattern p = Pattern.compile("(.+)=@\\1@");
    Matcher m = p.matcher(link);
    List<String> replaced = new ArrayList<>();
    
    while (m.find()) {
        m.appendReplacement(sb, "");
        replaced.add(m.group());
    }
    m.appendTail(sb);
    //to replace link with String stored in sb use link=sb.toString();
    //otherwise link will be unchanged
    System.out.println(sb);
    System.out.println(replaced);
    

    输出:

    www.thisisalink.com/&&&
    [tick1=@tick1@, tick2=@tick2@, tick3=@tick3@, tick4=@tick4@]
    

    【讨论】:

    • 谢谢 :) 太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多