#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("[.()]", ""));
}