Регулярное выражение для сопоставления строки после строки с точностью до запятой

#regex #string #regex-lookarounds #regex-group #regex-greedy

#регулярное выражение #строка #регулярное выражение-поиск #регулярное выражение-группа #регулярное выражение-жадное

Вопрос:

Вот пример строки.

"BLAH, blah, going to the store amp;^5, light Version 12.7(2)L6, anyway
plus other stuff Version 3.3.4.6. Then goes on an on for several lines..."

Я хочу записать только первый номер версии, не включая слово version, если это возможно, но не включая точки и круглые скобки. Результат остановится, когда встретит запятую. В результате было бы: "1272L6"

Я не хочу, чтобы он включал в текст другие экземпляры версии. Можно ли это сделать?

Я пробовал (?<=version)[^,]* Я знаю, что это не касается удаления точек и скобок и не касается последующих версий.

Комментарии:

1. Это можно сделать в два шага: 1) извлеките нужную вам подстроку 2) удалите из нее символы, не являющиеся числовыми. Вы не можете сопоставить непересекающиеся символы с помощью одной операции сопоставления, и я сомневаюсь, что вы можете использовать операцию замены регулярных выражений с захватом групп / обратных ссылок, если формат совпадения не всегда один и тот же.

2. Насколько строг формат версии? Трудно указать решение без точной грамматики. Может ли это также быть 12,7 (23) L6 или 12 (2,7) L62 и т.д.?

Ответ №1:

Это точное регулярное выражение, возможно, не лучшее решение, но оно может помочь вам получить 1272L6 :

 ([0-9]{2}).([0-9]{1})(([0-9]{1}))([A-Z]{1}[0-9]{1})
 

Он создает четыре группы (где $1$2$3$4 находится ваша цель 1272L6 ) и передает ., )и (.

Вы можете изменить {1} другое количество повторений, например {1,2} .

введите описание изображения здесь

Ответ №2:

Предполагая, что номер версии фиксирован для формата, но не для конкретных цифр или букв, вы могли бы сделать это.

   String s = "this is a test 12.7(2)L6, 13.7(2)L6, 14.7(2)L6";
  String reg = "(\d\d\.\d\(\d\)[A-Z]\d),";
  Matcher m = Pattern.compile(reg).matcher(s);
  if (m.find()) { // should only find first one
     System.out.println(m.group(1).replaceAll("[.()]", ""));
  }