【问题标题】:Java: Print specific substring based on characters appearing before, and end if meeting letters after?Java:根据之前出现的字符打印特定的子字符串,如果在之后遇到字母则结束?
【发布时间】:2016-10-11 18:34:41
【问题描述】:

我有一个输入字符串,假设它是 111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348 ,它有时也可能通过流输入为 111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348 BBBTTT

如何捕获 via 子字符串中“len”之后出现的数字?使用system.out.println(stringStr.substring(stringStr.lastIndexOf(" ") + 1)只会打印3348,如果它是上面字符串的最后一部分,但如果出现BBBTTT,它将不起作用。

如何在“len”之后打印子字符串的数字,但不包括后面的数字(可能是 0-9999,而不是更多),所以后面不包含任何字符?

【问题讨论】:

  • 这是正则表达式的候选对象。了解它。

标签: java string substring


【解决方案1】:

使用正则表达式。模式类似于“len ([\d]+)”

String inputString = "111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348 BBBTTT";
String regEx = "len ([\\d]+)";
String regExMatch = "";

Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(inputString);
if (m.find()) {
    regExMatch = m.group(1); // save the first capture group
}
System.out.println(regExMatch);

【讨论】:

  • 我不能直接在system.out.println行中使用这个吗?正则表达式是
  • @cbll 您可以将其存储到变量中或创建一个单独的函数并让它只返回字符串。如果您必须这样做,我想您可以将所有内容放在一行中,但这样做不是一个好习惯,而且很难阅读。
【解决方案2】:

您可以为此使用split 方法。

        String s = "111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348 BBBTTT";
    s = s.split("len")[1];
    s = s.replaceAll("\\D+", "");
    System.out.println(s);

或者只是

s = s.split("len")[1].replaceAll("\\D+", "");

【讨论】:

  • 我没有表达清楚。我只想要 1-4 位数字,不包括 BBBTTT
  • 如果你有111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348 BBBTT18T仍然不好,你会得到334818而不是3348
  • 然后再次使用 split s = s.split("len")[1];和 s = s.split(" ")[1];将从下一个空格分割
【解决方案3】:

您可以在这里使用正则表达式,但还有其他方法:

  1. 确定字符串中“len”的索引
  2. 加上 4 - 这就是你的号码开始的地方
  3. 从那里做一个子字符串

该字符串将包含“just digits”;或数字后跟一个空格。因此,如果有空格,您可以进行另一个 indexOf() 调用来计算;如果是这样,也扔掉那个空间之后的所有东西;喜欢:

String numberWithChars = "3348 BBBTTT";
int indexOfSpace = numberWithChars.indexOf(" ");
if  (indexOfSpace > 0) {
   String pureNumber = numberWithChars.substring(0, indexOfSpace);
} else {
   String pureNumber = numberWithChars;
}

希望对您有所帮助。

【讨论】:

    【解决方案4】:

    您可以将replaceFirst 与不那么简单的正则表达式一起使用:

    .*\blen\s+(\d+).*
    

    regex demo

    详情

    • .* - 除换行符之外的任何 0+ 字符,尽可能多
    • \blen - 一个完整的单词len\b 是一个单词边界)
    • \s+ - 1+ 个空格
    • (\d+) - 第 1 组捕获 1 个以上数字
    • .* - 除换行符以外的任何 0+ 个字符。

    $1 是对捕获到组 1 中的内容的反向引用。

    如果您的字符串可以包含换行符,请在正则表达式的开头添加 (?s)

    Java demo:

    String s  = "111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348";
    System.out.println(s.replaceFirst(".*\\blen\\s+(\\d+).*", "$1"));
    

    【讨论】:

      【解决方案5】:

      使用正则表达式的两个字符串示例:

              String s1 = "111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3348";
              String s2 = "111.112.111.0.0 > 111.33.44.55.11 pxs ikf len 3349 BBBTTT";
      
              Pattern pattern = Pattern.compile(".*len (\\d*).*");
              Matcher m1 = pattern.matcher(s1);
              Matcher m2 = pattern.matcher(s2);
              if (m1.matches()) {
                  System.out.println(m1.group(1));
              }
              if (m2.matches()) {
                  System.out.println(m2.group(1));
              }
      

      你可以把它放在一个单独的方法中:

      public class ExtractLen {
      private static final Pattern LEN_PATTERN = Pattern.compile(".*len (\\d*).*");
      
      public String extractLen(String s) {
          Matcher m1 = LEN_PATTERN.matcher(s);
          if (m1.matches()) {
              return m1.group(1);
          }
          return null;
      }}
      

      【讨论】:

      • 不能直接在system.out.println中作为条件实现吗,比如子字符串?
      • @cbll 您可以使用更新的答案等方法将其提取到一个类中
      猜你喜欢
      • 2014-05-22
      • 2013-07-20
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2017-08-03
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多