Regex не извлекает все подходящие слова - PullRequest
5 голосов
/ 13 мая 2019

Я пытаюсь извлечь слова, содержащие хотя бы один символ, из специального набора символов. Он поднимает некоторые слова, а не другие. Вот ссылка на regex101 для его проверки. Это регулярное выражение \b(\w*[āīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ]+\w*)\b, и это примерное предложение, которое я использую

Его полное имя Абу ʿĪса Мухаммад ибн ʿĪса ибн Савра ибн Муса ибн Аль-Данак Аль-Сулами Аль-Тирмидхи.

Оно должно соответствовать следующим словам:

Иса Мухаммад Иса Муса Аль-Дахак Аль-Сулами Аль-Тирмидхи

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

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Вы можете использовать

[\w-]*[āīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ][\wāīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ-]*

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

https://regex101.com/r/ovJoLt/2

1 голос
/ 13 мая 2019

Эту работу можно выполнить, включив флаг Unicode /u (чтобы утверждения \b на границе слова поддерживали символы Unicode) и добавив дефисы к окружающим группам символов:

/\b[\w-]*[āīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ]+[\w-]*\b/gu

Кроме того, вам не нужна группа захвата, поскольку только совпадающие символы образуют желаемый результат (\b - утверждение нулевой ширины).

Демо

0 голосов
/ 13 мая 2019

Вы не делаете ничего плохого, за исключением того, что для соответствия границ юникода вы должны включить модификатор u или использовать (?<!\S)\w*[āīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ]+\w*(?!\S)

Если вы хотите использовать дефис, добавьте его в класс вашего персонажа (?<!\S)\w*[āīūẓḍḥṣṭĀĪŪẒḌḤṢṬʿʾ-]+\w*(?!\S)

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