什么等效于.replaceSecond或.replaceThird?

时间:2018-11-19 10:06:06

标签: java string replace

在此代码中,我们使用email方法从.replaceFirst字符串中删除了子字符串“ luna”。我们正在删除+和@之间的字符。但这仅在最初的情况下发生,因为我们使用了.replaceFirst。如果我们要定位+和@的第二个实例以删除“史密斯”怎么办? 现在我们的输出是alice+@john+smith@steve+oliver@,但我们想要alice+luna@john+@steve+oliver@

public class Main {

    public static void main(String[] args) {

        String email = "alice+luna@john+smith@steve+oliver@";

        String newEmail = email.replaceFirst("\\+.*?@", "");

        System.out.println(newEmail);

    }
}

4 个答案:

答案 0 :(得分:2)

您可以找到第二个+,如下所示:

int firstPlus = email.indexOf('+');
int secondPlus = email.indexOf('+', firstPlus + 1);

(如果需要,您需要处理找不到两个+的情况。)

然后找到以下@

int at = email.indexOf('@', secondPlus);

然后将其缝合在一起:

String newEmail = email.substring(0, secondPlus + 1) + email.substring(at);

String newEmail2 = new StringBuilder(email).delete(secondPlus + 1, at).toString();

Ideone demo

答案 1 :(得分:1)

不幸的是,Java没有诸如replace second,replace third等方法。您可以replaceAll(将替换所有出现的事件),也可以在已替换的字符串上再次调用replaceFirst。这基本上是在替换第二个。如果只想替换第二个,则可以使用子字符串或正则表达式匹配器对结果进行迭代。

  public static void main(String[] args) {

        String email = "alice+luna@john+smith@steve+oliver@";

        String newEmail = email.replaceFirst("\\+.*?@", "");
        newEmail = newEmail .replaceFirst("\\+.*?@", ""); //this replaces the second right? :) 
        newEmail = newEmail .replaceFirst("\\+.*?@", ""); // replace 3rd etc.

        System.out.println(newEmail);

    }

答案 2 :(得分:0)

您可以将以下n方法中的参数replaceNth的值替换为2、3,以执行与 replaceSecond replaceThird 完全相同的操作。强>。 (请注意:此方法可以应用于n的任何其他值。如果不存在第n个模式,则仅返回给定的字符串)。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static String replaceNth(String str, int n, String regex, String replaceWith) {
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()) {
            n--;
            if (n == 0) {
                return str.substring(0,m.start() + 1)+ replaceWith + str.substring(m.end() - 1);
            }
        }
        return str;
    }

    public static void main(String args[]) {
        String email = "alice+luna@john+smith@steve+oliver@";
        System.out.println(replaceNth(email, 2, "\\+.*?@", ""));
    }
}

答案 3 :(得分:0)

我认为最好将此逻辑封装到单独的方法中,其中Stringgroup position是参数。

private static final Pattern PATTERN = Pattern.compile("([^+@]+)@");

private static String removeSubstringGroup(String str, int pos) {
    Matcher matcher = PATTERN.matcher(str);

    while (matcher.find()) {
        if (pos-- == 0)
            return str.substring(0, matcher.start()) + str.substring(matcher.end() - 1);
    }

    return str;
}

此外,您可以添加更多方法来简化此实用程序的使用。像removeFirst()removeLast()

public static String removeFirst(String str) {
    return removeSubstringGroup(str, 0);
}

public static String removeSecond(String str) {
    return removeSubstringGroup(str, 1);
}

演示:

String email = "alice+luna@john+smith@steve+oliver@";
System.out.println(email);
System.out.println(removeFirst(email));
System.out.println(removeSecond(email));
System.out.println(removeSubstringGroup(email, 2));
System.out.println(removeSubstringGroup(email, 3));

输出:

alice+luna@john+smith@steve+oliver@
alice+@john+smith@steve+oliver@
alice+luna@john+@steve+oliver@
alice+luna@john+smith@steve+@
alice+luna@john+smith@steve+oliver@

Ideone demo