используйте регулярное выражение для сопоставления TY_111.22-L007-C010 из текста

#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]
 

Хорошо … Я использовал три строки кода, но первая и третья предназначены только для настройки данных и их печати.