Java正则表达式-在字符串中查找数值

时间:2018-09-06 14:31:39

标签: java regex matcher

在下面的两个字符串(天气确定)中,我需要使用正则表达式查找"xxxFT"之后的第一个"BKN"值,然后仅提取数值: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"

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

2 个答案:

答案 0 :(得分:1)

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

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+",""); 

字符串1的输出:2400 字符串2的输出:700

答案 1 :(得分: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));
}