Регулярное выражение (регулярное выражение).Как игнорировать или исключать все промежуточное? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть этот входной текст:

142d  000781fe0000326f BPD    false    65535 FSK_75     FSK_75     -51.984   -48

Я хочу использовать регулярное выражение для извлечения 000781fe0000326f и -51.984, поэтому вывод выглядит следующим образом

000781fe0000326f-51.984

Я могу использовать [0-9]{5,7}(?:[a-z][a-z0-9_]*) и ([-]?\\d*\\.\\d+)(?![-+0-9\\.]) для извлечения 000781fe0000326f и -51.984 соответственно.Есть ли способ игнорировать или исключать все между 000781fe0000326f и -51.984?Чтобы игнорировать все, что будет захвачено не жадным наполнителем (. *?)?

String ref="[0-9]{5,7}(?:[a-z][a-z0-9_]*)_____([-]?\\d*\\.\\d+)(?![-+0-9\\.])";

            Pattern p = Pattern.compile(ref,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
            Matcher m = p.matcher(input);
            while (m.find())
            {
                String all = m.group();
                //list3.add(all);
            }      

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы не можете игнорировать слова между ними.Вы можете включить их всех.что-то вроде этого будет включать все из них.

[0-9] {5,7} (?: [az] [a-z0-9 _] ) [a-zA-Z0-9_] ([-]? \ D *. \ D +) (?! [- + 0-9.])

Но это не то, что вы хотите.Я думаю, что лучшая ставка - это либо иметь 2 регулярных выражения и затем комбинировать результат, либо разбивать строку на символы пробелов / табуляции и проверять 'n' элементы по мере необходимости

0 голосов
/ 08 октября 2018

В качестве примера данных вы можете использовать чередование |, чтобы сопоставить любое из регулярных выражений в вашем вопросе, а затем объединить их.

Обратите внимание, что в своем регулярном выражении вы можете написать(?:[a-z][a-z0-9_]*) как [a-z][a-z0-9_] и вам не нужно экранировать точку в классе символов.

Например:

[0-9]{5,7}[a-z][a-z0-9_]*|-?\d*\.\d+(?![-+0-9.])

Regexдемоверсия

String regex = "[0-9]{5,7}[a-z][a-z0-9_]*|-?\\d*\\.\\d+(?![-+0-9.])";
String string = "142d  000781fe0000326f BPD    false    65535 FSK_75     FSK_75     -51.984   -48";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

String result = "";

while (matcher.find()) {            
    result += matcher.group(0);
}

System.out.println(result); // 000781fe0000326f-51.984

Демоверсия Java

0 голосов
/ 08 октября 2018

Нет способа объединить строки, как в , регулярное выражение , но легко создать группу для первого совпадения, группу для второго совпадения, а затем использовать m.group(1) + m.group(2) для объединениядве группы вместе и создайте желаемую комбинированную строку.

Также обратите внимание, что [0-9] упрощается до \d, набор символов с одним токеном упрощается только до этого токена, [a-z0-9_] с i флаг упрощается до \w, и нет необходимости экранировать . внутри набора символов:

String input = "142d  000781fe0000326f BPD    false    65535 FSK_75     FSK_75     -51.984   -48";
String ref="(\\d{5,7}(?:[a-z]\\w*)).*?((?:-?\\d*\\.\\d+)(?![-+\\d.]))";

Pattern p = Pattern.compile(ref,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(input);
while (m.find())
{
  String all = m.group(1) + m.group(2);
  System.out.println(all);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...