#java #regex
#java #регулярное выражение
Вопрос:
У меня есть шаблон [a-z0-9]{9}|[a-z0-9]{11}
Здесь я должен проанализировать это регулярное выражение, чтобы получить 9 и 11 для будущего сообщения о том, что «вам нужно ввести 9 или 11 символов»
Также у меня есть регулярное выражение, подобное
[a-z0-9]{9}
[a-z0-9]{9,}
[a-z0-9]{9,11}
Мне нужно написать какой-то метод, который может анализировать все эти строки, чтобы получить количество доступных символов.
Я сделал
Pattern.compile(".*\{(\d )(,?)(\d*)\}(\|.*\{(\d )\})?");
Он находит только последнее число в моем первом шаблоне. Но другие не распознают.
Как проверить все строки?
Upd: я не могу понять, но в Java первый шаблон из ответа {(d )(?:,(d*))?}
не совпадает, но найдите 3 мои строки. Но первая и самая длинная строка, которую он не находит.
Чем отличаются совпадения и поиск? И почему этот шаблон может находить совпадения в web, но не в Java? И иногда я делаю matcher.find(); // return 2 matcher.group(1); // No match found exception
Ответ №1:
Это регулярное выражение должно работать для вас : [^\](?:\\)*{(d )(?:,(d*))?}
.
Часть [^\](?:\\)*
посвящена случаю экранирования косой черты.
Ниже приведен пример кода Java:
public static void main(String[] args) {
Pattern p = Pattern.compile("[^\\](?:\\\\)*\{(\d )(?:,(\d*))?\}");
String testInput = "[a-z0-9]{1,2}|[a-z0-9]{3,}|[a-z0-9]{4}";
Matcher matcher = p.matcher(testInput);
while (matcher.find()){
System.out.println("Next matching found:");
if(matcher.group(2) == null){
System.out.println("Strict: " matcher.group(1));
}else {
System.out.println("Min: "
matcher.group(1)
", Max: "
("".equals(matcher.group(2)) ? "Infinte" : matcher.group(2)));
}
}
}
Вывод:
Next matching found:
Min: 1, Max: 2
Next matching found:
Min: 3, Max: Infinte
Next matching found:
Strict: 4
Комментарии:
1. Спасибо за ваши попытки, но оба варианта оказались неудачными. Да, я проверил их по предоставленной вами ссылке, но в Java это не работает ((( И, кстати, что это значит?: Это жадный квантификатор? Если я выберу? — это означает 0/1 раз, но что это значит?:
2. Проверьте обновление… Конструкция, подобная
(?:)
группе без захвата, т. Е. Группе, Которую вы не хотели бы анализировать, а скорее для использования только как часть вашего правила.3. Зачем нужна эта часть
[^\\](?:\\\\)
?4. потому что в вашем выражении могут быть косые черты в качестве управляющих символов. Поскольку косая черта может использоваться для экранирования косых черт, эта часть используется для проверки,
{
экранируется{
ли она или является частью более широкой картины, например\{
, где{
определяется квантификатор литерала «.5. Я бы никогда не подумал об этом 🙂 и даже после вашего объяснения я с трудом это понимаю) но спасибо