【问题标题】:How to make substring() read a string until a certain character?如何让 substring() 读取字符串直到某个字符?
【发布时间】:2016-02-08 23:13:03
【问题描述】:

我想创建一个子字符串说:

String s1 = "derp123";

s2 = s1.substring(0, *index where there's a number*);

除了使用 replaceAll 方法之外,我还有什么方法可以做到这一点?

我不想替换字符串中的所有数字,一旦方法检测到数字0-9,我想停止读取字符串。

【问题讨论】:

  • 听起来你需要一个基本的正则表达式。
  • s1.replaceAll("\\d.*", "") 可能会成功...
  • 请注意,replaceAll 不会修改您现有的字符串;它会生成一个新字符串。
  • for(int i...) if s1.charAt(i) is '0'-'9' return s1.substring(0,i)

标签: java string substring


【解决方案1】:

为此,正则表达式是你的朋友。

我只会向您展示您的示例的代码,但您应该了解更多关于正则表达式的功能(和限制)的信息。请参阅Pattern 的 javadoc。

String s1 = "derp123";
Matcher m = Pattern.compile("^\\D*").matcher(s1);
if (m.find())
    System.out.println(m.group()); // prints: derp

请注意,cmets 中显示的replaceAll() 方法也是使用正则表达式。

【讨论】:

    【解决方案2】:

    这就是你想要的。

    String s1 = "derp123";
    String patternStr = "[0-9]";
    Matcher matcher = Pattern.compile(patternStr).matcher(s1);
    if (matcher.find()) {
       System.out.println(s1.substring(0, matcher.start()));
    }
    

    这会给你没有数字的字符串部分

    【讨论】:

    • 请注意,如果字符串不包含任何数字,这将跳过打印语句,OP 可能希望打印整个字符串。
    • 是的。但他的主要问题是如果字符串包含任何数字,则删除它们。他可以在 else 条件下解决剩下的问题。
    【解决方案3】:

    由于 OP 说他不想使用replace,因此正则表达式这是我的建议。请注意,在我看来,已经给出的 REGEX 版本要优雅得多,我提供这个只是为了展示其他方法。

    String s1 = "blahblah1234";
    String s2 = s1.substring(0, firstNumberPos(s1));
    System.out.println(s2);
    

    还有firstNumberPos 定义

    public static int firstNumberPos(String str){
        for ( int i=0; i<str.length(); i++ ){
            if ( str.charAt(i) >= '0' && str.charAt(i) <= '9'){
                return i;
            }
        }
        return str.length();
    }
    

    注意我不关心空点,你还是要检查一下。

    【讨论】:

    • dude.... 这些字符 (0-9) 具有连续值。只需检查&gt;='0'&lt;='9' 就足够了。
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2018-01-26
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多