Java Regex - найти числовое значение в строке - PullRequest
0 голосов
/ 06 сентября 2018

В приведенных ниже двух строках (погодные условия) мне нужно найти с помощью выражения регулярного выражения первое "xxxFT" значение после "BKN", а затем извлечь только числовое значение: xxxx

В 1-й строке окончательное значение будет 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 голосов
/ 06 сентября 2018

со ссылкой на комментарий 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 для первой и второй строки соответственно.

Если есть несколько совпадений, это входная строка, тогда единственное, что нужно изменить, это оператор if, который должен быть преобразован в while.

while(matcher.find()) {
    System.out.println(matcher.group(1));
}
0 голосов
/ 06 сентября 2018

Обновление: Если вы хотите с одним регулярным выражением, используйте следующий код:

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

Старый Во-первых, вам нужно получить подстроку, начиная с BKN, поэтому

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 Выход String2: 700

...