在此代码中,我们使用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);
}
}
答案 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();
答案 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)
我认为最好将此逻辑封装到单独的方法中,其中String
和group 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@