Java 在字符串上使用子字符串的替代方法

Java 在字符串上使用子字符串的替代方法,java,Java,我有一个包含下划线的字符串,如下所示: 123445_Lisick 我想删除下划线后字符串中的所有字符。我已经尝试了下面的代码,它正在工作,但是有没有其他方法可以做到这一点,因为我需要将此逻辑放入for循环中,以从ArrayList提取元素 public class Test { public static void main(String args[]) throws Exception { String str = "123445_Lisick"; i

我有一个包含下划线的字符串,如下所示:

123445_Lisick

我想删除下划线后字符串中的所有字符。我已经尝试了下面的代码,它正在工作,但是有没有其他方法可以做到这一点,因为我需要将此逻辑放入
for
循环中,以从ArrayList提取元素

public class Test {
    public static void main(String args[]) throws Exception {
        String str = "123445_Lisick";
        int a = str.indexOf("_");
        String modfiedstr = str.substring(0, a);
        System.out.println(modfiedstr);
    }
}
另一种方法是使用该方法

但我不认为这能给你带来什么。您使用的方法没有什么问题。

另一种方法是使用该方法


但我不认为这能给你带来什么。你使用的方法没有什么问题。

你的方法很好。虽然API文档中没有明确说明,但我觉得可以安全地假设indexOf(char)将在O(n)时间内运行。由于字符串是无序的,并且您不知道下划线的位置,因此无法避免这种线性搜索时间。完成搜索后,需要提取子字符串以供将来处理。通常可以安全地假设,对于这样的简单操作,在一种经过合理优化的语言中,库函数将得到优化

但是请注意,您正在做一个隐含的假设:

  • 字符串中将存在下划线
  • 如果字符串中有多个下划线,则输出中应包括除第一个下划线以外的所有下划线
如果这两个假设中的任何一个都不总是成立的,那么您需要做出调整来处理这些情况。在这两种情况下,您至少应该防御性地检查从indexAt(char)返回的-1,以指示字符串中不包含“1”。假设在这种情况下需要整个字符串,可以使用如下内容:

public static String stringAfter(String source, char delim) {
     if(source == null) return null;
     int index = source.indexOf(delim);
     return (index >= 0)?source.substring(index):source;
}

你的方法很好。虽然API文档中没有明确说明,但我觉得可以安全地假设indexOf(char)将在O(n)时间内运行。由于字符串是无序的,并且您不知道下划线的位置,因此无法避免这种线性搜索时间。完成搜索后,需要提取子字符串以供将来处理。通常可以安全地假设,对于这样的简单操作,在一种经过合理优化的语言中,库函数将得到优化

但是请注意,您正在做一个隐含的假设:

  • 字符串中将存在下划线
  • 如果字符串中有多个下划线,则输出中应包括除第一个下划线以外的所有下划线
如果这两个假设中的任何一个都不总是成立的,那么您需要做出调整来处理这些情况。在这两种情况下,您至少应该防御性地检查从indexAt(char)返回的-1,以指示字符串中不包含“1”。假设在这种情况下需要整个字符串,可以使用如下内容:

public static String stringAfter(String source, char delim) {
     if(source == null) return null;
     int index = source.indexOf(delim);
     return (index >= 0)?source.substring(index):source;
}

你也可以用这样的东西:

public class Main {
  public static void main(String[] args) {
    String str = "123445_Lisick";
    Pattern pattern = Pattern.compile("^([^_]*).*");
    Matcher matcher = pattern.matcher(str);
    String modfiedstr = null;
    if (matcher.find()) {
      modfiedstr = matcher.group(1);
    }
    System.out.println(modfiedstr);
  }
}
正则表达式从输入字符串的开头开始对模式进行分组,直到找到一个非
的字符


然而,正如蜥蜴比尔所写,我不认为你现在这样做的方法有任何问题。我会像你那样做。

你也可以这样做:

public class Main {
  public static void main(String[] args) {
    String str = "123445_Lisick";
    Pattern pattern = Pattern.compile("^([^_]*).*");
    Matcher matcher = pattern.matcher(str);
    String modfiedstr = null;
    if (matcher.find()) {
      modfiedstr = matcher.group(1);
    }
    System.out.println(modfiedstr);
  }
}
正则表达式从输入字符串的开头开始对模式进行分组,直到找到一个非
的字符


然而,正如蜥蜴比尔所写,我不认为你现在这样做的方法有任何问题。我会像你那样做。

我肯定还有其他的方法,但是你这样做有什么不对吗?这看起来是完成任务的一种有效方法。你可以使用正则表达式,但我看不出它有什么优势,而且它的效率可能会更低。请看这篇文章:另一种方法是使用带有
String#replaceAll(String,String)
split
的正则表达式,现在就用你现在的方式来做。我肯定还有其他的方法,但是你现在的方式有什么问题吗?这看起来是完成任务的一种有效方法。你可以使用正则表达式,但我看不出它有什么优势,而且它的效率可能会更低。请参阅本文:另一种方法是使用带有
String#replaceAll(String,String)
split
的正则表达式,按现在的方式执行。在完全没有下划线的情况下,这种方法也能很好地工作。(可能需要,也可能不需要)在没有下划线的情况下,这也能很好地工作。(可能需要,也可能不需要。)