【问题标题】:Java Regex - find a numeric value in a StringJava Regex - 在字符串中查找数值
【发布时间】:2018-09-06 14:31:38
【问题描述】:

在下面的两个字符串(天气)中,我需要用正则表达式找到"BKN" 之后的第一个"xxxFT" 值,然后只提取数值:xxxx

在第一个字符串中,最终值为2400,第二个为700。

"BKN" 和 "xxxxFT" 之间可能是一个附加词,这取决于。即:"BKN CB 2400FT" 或 "BKN 700FT"

String str1 = "4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"

String str2 = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"

我可以使用哪种正则表达式模式?

【问题讨论】:

  • 你尝试了什么?
  • 你需要所有以 xxxFT 作为模式的值吗?
  • BKN.*?\s+(\d+)FT 将适用于您提供的两种情况 - 它实际上抓取了所有 xxx,但您可以只使用第一个。顺便说一句,对于 regex,您可以访问 regex101.com,这是 regex 的绝佳资源。 (我不隶属。)
  • @Jeutnarg 非常感谢它运行良好!!!

标签: java regex matcher


【解决方案1】:

参考 Jeutnarg 注释,我们可以通过使用 Matcher 组来获得没有任何子字符串等的解决方案:

public static void main (String[] args) throws java.lang.Exception
{

    String text    =
        "4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T" + 
        " 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";
        text = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";

    String patternString = "BKN.*?\\s+(\\d+)FT";

    Pattern pattern = Pattern.compile(patternString);

    Matcher matcher = pattern.matcher(text);
    if(matcher.find()) {
        System.out.println(matcher.group(1));
    } else {
        System.out.println("nothing matched");
    }
}

输出将是所要求的。 2400 和 700 相应地用于第一和第二字符串。

如果输入字符串有多个匹配项,那么唯一需要更改的是应该转换为 while 的 if 语句。

while(matcher.find()) {
    System.out.println(matcher.group(1));
}

【讨论】:

  • 这对你有用吗?
  • 是的,它工作得很好,我提高了对正则表达式的理解:o)
  • 这是个好消息。然后,您可以选择正确的答案来帮助有相同问题的其他用户更快地找到他们的答案。 :)
【解决方案2】:

更新: 如果您想使用单个正则表达式,请使用以下代码:

Pattern pattern = Pattern.compile("BKN.*?\\s+(\\d+)FT");
Matcher matcher = pattern.matcher(String1);
if (matcher.find()) {
        System.out.println(matcher.group(1));
}

旧首先你需要得到从BKN开始的SubString所以

int startIndex = String1.indexOf("BKN");
String str = String1.subString(startIndex);

然后你需要在 BKN 和 FT 之间减少它,以便获得 FT 的索引

startIndex = 0;
int endIndex = str.indexOf("FT")+1;
str = str.subString(startIndex,endIndex);

最后你可以使用这个正则表达式并从字符串中删除非数字字符

str = str.replaceAll("\\D+",""); 

String1 的输出:2400 String2 的输出:700

【讨论】:

  • 这就是我所做的,但我认为只有一个神奇的正则表达式才能找到它。谢谢。
  • 我用一个正则表达式更新了我的答案,请检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多