Как ограничить негативную перспективу в регулярных выражениях - PullRequest
0 голосов
/ 10 октября 2018

У меня есть строка:

Symphony Veterinary Center                                                           

symphony care veterinary  

170 cort 96th St.,                                                                   
naib, NZ 10025                                                            
212-866-8000                                                                                                                                              

                We care yours like ours !!                                                                                                                  

Я пытаюсь это регулярное выражение :

((?i)^(?=.*?(?:veterinary|animal[^s]|hospital| care |pets?|clinic)) *(?:[^ \n\r:]+? +?){1,5}$)(?:(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))[\s\S]*?)(\d{2,}[\s\S]+?(?: [A-Z][A-Za-z] (?:\d+-)?\d+))

Согласно регулярному выражению, первая группа должна захватить больницуимя и вторая группа будет захватывать только адрес.

В этом регулярном выражении у меня есть отрицательный прогноз (?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic)) между первой группой и второй группой, чтобы убедиться, что между первой и второй группой нет таких ключевых слов, как животное, животное, больница.

Но это совпадает только тогда, когда я удаляю care в последней строке строки.Я не знаю, почему отрицательный взгляд проверяет до конца строки, а не до второй группы?

1 Ответ

0 голосов
/ 10 октября 2018

Шаблон (?:(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))[\s\S]*?) довольно громоздок, но, похоже, вы хотите сопоставить любой текст вплоть до крайнего левого вхождения veterinary, animal, hospital, care, pet, petsили clinic.

Вам необходимо исправить эту часть регулярного выражения, например

(?:(?!veterinary|animal|hospital|care\ |pets?|clinic)[\s\S])*?

См. демонстрационную версию regex

Шаблон будет соответствоватьлюбой символ ([\s\S]), как можно меньше (*?), который не запускает последовательности символов в отрицательном прогнозе (?!veterinary|animal|hospital|care\ |pets?|clinic).

Я также советую форматировать строку шаблона (как в моемdemo) и используйте опцию модификатора Pattern.COMMENTS (не забывайте избегать буквальных пробелов и символов #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...