2017-02-19 2 views
0

Я использую регулярное выражение в Java для извлечения данных из записей пользователей, как эти:вложенных скобки в Regex

String entry1 = "add to xx16,John Doe"; 
String entry2 = "add to ab20,John Doe;Richard Roe;John Stiles"; 

Они могут иметь несколько имен, но если у них есть их, они должны быть разделены точкой с запятой. Теперь я хочу, чтобы regex вернул мне эти параметры. Я придумал, что

Pattern pattern = Pattern.compile("add to ([a-z|\\d]*),([a-zA-Z]*\\s[a-zA-Z]*)[;([a-zA-Z]*\\s[a-zA-Z]*)]*"); 
Matcher matcher = pattern.matcher(entry); 
matcher.matches(); 
//get inputs with matcher.group(); 

Это хорошо работает с записями, как entry1, но не с entry2. Кто-нибудь видит мою ошибку?

+2

Какой выход вы ищете? – shmosel

+2

это неправильное использование символьного класса '[...]': [[([a-zA-Z] * \ s [a-zA-Z] *)] ' –

+1

В' entry2' (0) = «ab20», group (1) = «John Doe», группа (2) = «Richard Roe», группа (3) = «John Stiles» –

ответ

3

У вас не может быть неограниченного количества групп таких групп. Просто захватите их всех, потом разделите.

Поскольку вы не проверяете, действительно ли совпадает совпадение, я предполагаю, что вам не слишком важно проверять формат ввода и просто хотеть захватить значения. Таким образом, вы могли бы сделать что-то вроде этого:

Pattern pattern = Pattern.compile("add to (\\w+),(.*)"); 
Matcher matcher = pattern.matcher(entry); 
matcher.matches(); // FIXME: check if it matches 
String[] names = matcher.group(2).split(";"); 
+0

Я действительно забочусь о подтверждении формата, но я просто удалил эту часть, чтобы мой пример был простым. Разве нет возможности делать то же самое, одновременно проверять и получать данные? –

+0

Если вам небезразлична проверка формата, вам необходимо полностью пересмотреть свое регулярное выражение, потому что он вряд ли сделает то, что, по вашему мнению, он делает. Вы еще не предоставили достаточной информации о том, что представляет собой достоверные данные, чтобы полностью исправить ваше сломанное регулярное выражение. –

1
Skiping the first 7 characters ("add to ") from the beginning using the regular expression (?:^.{7}) and then splitting it with either with comma or semicolon [,;] 

String entry1 = "add to xx16,John Doe"; 
String entry2 = "add to ab20,John Doe;Richard Roe;John Stiles"; 

String[] str = entry1.split("(?:^.{7})|[,;]"); 
for(String st : str){ 
    System.out.println(st); 
} 

str = entry2.split("(?:^.{7})|[,;]"); 
for(String st : str){ 
    System.out.println(st); 
} 

выход:

xx16 
John Doe 

ab20 
John Doe 
Richard Roe 
John Stiles 
Смежные вопросы