2016-11-06 2 views
1
abc([^\r\n]*) // 0 or more 

abc([^\r\n]+)? // 1 or more, but it's optional 

В Java. Они выглядят одинаково для меня.Любая разница между этими двумя регулярными выражениями?

+1

Они выглядят одинаково для меня. –

+1

В случае 'abc' первая будет хранить пустую строку для первой группы захвата, вторая не сохранит эту группу, однако я недостаточно знаком с java, чтобы узнать, что происходит, когда вы пытаетесь получить доступ к группе 1. Обратите внимание, что в других вариантах регулярных выражений, где поддерживается условное сопоставление (PCRE, Boost, .net и т. Д.) Или замена (Boost), это может иметь огромное значение. Ох и Delphi имеет проблемы с доступом к неподтвержденным группам захваченных групп. –

+0

Ничего себе. Я просто должен был проверить его, и, наверное, я написал неправильный ответ. https://regex101.com/r/H6nkxD/1 показывает, что разные парсеры действительно ведут себя по-разному относительно группы '' '(...)?' '' – Art

ответ

2

Существует небольшая разница между ними. Следующий code

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

class Example 
{ 
    public static void main (String[] args) 
    { 
     String text = "abc"; 
     Pattern p1 = Pattern.compile("abc([^\\r\\n]*)"); 
     Matcher m1 = p1.matcher(text); 
     if (m1.find()) { 
      System.out.println("MatchCount: " + m1.groupCount()); 
      System.out.println("Group 1: " + m1.group(1)); 
     } else { 
      System.out.println("No match."); 
     } 
     Pattern p2 = Pattern.compile("abc([^\\r\\n]+)?"); 
     Matcher m2 = p2.matcher(text); 
     if (m2.find()) { 
      System.out.println("MatchCount: " + m2.groupCount()); 
      System.out.println("Group 1: " + m2.group(1)); 
     } else { 
      System.out.println("No match."); 
     } 
    } 
} 

дает выход:

MatchCount: 1 
Group 1: 
MatchCount: 1 
Group 1: null 

Таким образом, в случае строки abc первое регулярное выражение создает группа записи с пустым содержимым, а во второй группе пуст, и, таким образом, не соответствует. Хотя я не знаком с Java, я думаю, вам придется относиться к ним немного иначе.

Sidenote:

Java не поддерживает условную соответствия (в отличие от PCRE, .net, увеличить и некоторые другие) и условно замена (в отличие от Boost), где это будет иметь огромное значение. Ох и Дельфи имеет issues with optional named capturing groups.

Смежные вопросы