JAVA提取变量子字符串

时间:2020-05-16 17:41:51

标签: java string

我有一个字符串数组“ stringArray”,内容如下:

"ADU-30"
"ADU-30 plus a cam"
"ADU-30 plus internal cam"
"ADU-60"
"ADU-60 plus a cam"
"ADU-60 plus internal cam"
"ADU-301"

我的目标是能够提取“ ADU-”部分,其中包括连字符右侧的数字。目前,我可以提取连字符右侧仅有两个数字的数字,如下所示:

for (int i = 0; i < stringArray.length(); i++) {
   stringArray[i] = stringArray[i].substring(0,6);
}

但是,当我将子字符串参数从substring(0,6)更改为substring(0,7)时,它崩溃在连字符右边仅两位数字的项目上。如何存储三位数的项目?另外,是否有更好的方法可以使用子字符串呢?我想要的最终结果是以下字符串数组:

"ADU-30"
"ADU-60"
"ADU-301"

4 个答案:

答案 0 :(得分:2)

按照当前的模式,您可以将硬编码的子字符串替换为基于正则表达式的replaceAll(或replaceFirst):

for (int i = 0; i < stringArray.length; i++) {
  stringArray[i] = stringArray[i].replaceAll("(ADU-\\d+).*", "$1");
}

这表示用匹配ADU-\\d+的部分或组替换整个字符串,该部分或组是字符串"ADU-",后跟1个或多个数字。捕获组".*"之后的模式只是说要匹配零个或多个任何类型的字符,这将照顾字符串的剩余部分(可能是空的)。

测试:

String[] stringArray = {
        "ADU-30",
        "ADU-30 plus a cam",
        "ADU-30 plus internal cam",
        "ADU-60",
        "ADU-60 plus a cam",
        "ADU-60 plus internal cam",
        "ADU-301"
        };

for (int i = 0; i < stringArray.length; i++) {
   stringArray[i] = stringArray[i].replaceAll("(ADU-\\d+).*", "$1");
}

for(String str : stringArray)
    System.out.println(str);

输出:

ADU-30
ADU-30
ADU-30
ADU-60
ADU-60
ADU-60
ADU-301

答案 1 :(得分:1)

“强力”方法如下:

for (int i = 0; i < stringArray.length; i++) {
        String s = stringArray[i];
        StringBuffer sb = new StringBuffer();
        for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                if (c == ' ')
                        break;
                sb.append(c);
        }
        stringArray[i] = sb.toString();
}

答案 2 :(得分:1)

尝试使用Java Pattern和Matcher类。

String[] stringArray = new String[] {"ADU-6022 plus a cam",
                                    "ADU-30",
                                    "ADU-30 plus a cam",
                                    "ADU-30 plus internal cam",
                                    "ADU-60",
                                    "ADU-60 plus a cam",
                                    "ADU-60 plus internal cam",
                                    "ADU-301"};
String regex = "(ADU-\\d+)";
Pattern p = Pattern.compile(regex);
Matcher m;

for (int i = 0; i < stringArray.length; i++) {
    m = p.matcher(stringArray[i]);
    while (m.find()) {
        System.out.println(m.group(1) );
    }
}

答案 3 :(得分:0)

使用正则表达式提取第一组。

  // String to be scanned to find the pattern.
  String line = "ADU-30 plus a cam";
  String pattern = "^(ADU-\\d+).*$";

  // Create a Pattern object
  Pattern r = Pattern.compile(pattern);

  // Now create matcher object.
  Matcher m = r.matcher(line);

  if (m.find()) {
     System.out.println("Found value: " + m.group(0) );
  } else {
     System.out.println("NO MATCH");
  }

此模式^(ADU-\d+).*$说:

  1. 从字符串(^)的开头开始

  2. 捕获“ ADU” +一些数字((ADU-\d+)

  3. 匹配任何内容,直到字符串(.*$)的结尾

相关问题