#java #regex
#java #регулярное выражение
Вопрос:
Я хочу получить TY_111.22-L007-C010, Tzo11-L010-C100 и Tff-L010-C110 из этой строки с регулярным выражением
"12.5*MAX("TY_111.22-L007-C010";"Tzo11-L010-C100";"Tff-L010-C110")
Я протестировал это, T.*-Ld*-Cd*
но это не дает желаемого результата :
Мой код java для тестирования
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "T.*-L\d*-C\d*";
final String string = ""12.5*MAX(\"TY_111.22-L007-C010\";\"Tzo11-L010-C100\";\"Tff-L010-C110\"";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i ) {
System.out.println("Group " i ": " matcher.group(i));
}
}
Ответ №1:
Вам нужно использовать это регулярное выражение T.*?-Ld*?-Cd*
final String regex = "T.*?\-L\d*?\-C\d*";
Примечание: вам нужно избегать дефисов -
и использовать нежадный квантификатор .*?
вместо .*
, также вы можете использовать только matcher.group()
вместо matcher.group(0)
, в вашем регулярном выражении у вас нет групп, поэтому 0
бесполезно.
Результаты
Full match: TC_24.00-L010-C090
Full match: TC_24.00-L010-C100
Full match: TC_24.00-L010-C110
Ответ №2:
Зачем использовать подробный сопоставитель шаблонов регулярных выражений, когда вы можете решить проблему с помощью одной строки кода:
String input = "12.5*MAX("Txxxx-L007-C010";"Txxxx-L010-C100";"Txxxx-L010-C110")";
String[] matches = input.replaceAll("^.*?"|"[^"]*$", "")
.split("";"");
System.out.println(Arrays.toString(matches));
Это печатает:
[Txxxx-L007-C010, Txxxx-L010-C100, Txxxx-L010-C110]
Хорошо … Я использовал три строки кода, но первая и третья предназначены только для настройки данных и их печати.