Я пытаюсь совместить два слова или меньше до и после определенного ключевого слова с использованием регулярного выражения. Текст на арабском языке, поэтому я использовал \S+ в приведенном ниже выражении в Java-коде, чтобы соответствовать арабским символам.
Я столкнулся с ситуацией, когда ключевое слово произошло дважды в одной строке с расстоянием, меньшим или равным двум словам.
Итак, как я могу отредактировать это выражение для обработки такого особого случая.
Арабский Пример: ввод текста: اذا كان هذا مثال ودليل اذا هذا مثال اخر
regex: ((\S+\s*){0,2})\bهذا\b\s*((\S+\s*){0,2})
необходимо извлечь группу 1 и 3.
прогнозируемый результат:
фактический результат:
Пример на английском языке для иллюстраций:
переведенный текст: если это пример, это еще один
regex: ((\S+\s*){0,2})\bis\b\s*((\S+\s*){0,2})
необходимо извлечь группу 1 и 3.
прогнозируемый результат:
фактический результат:
Пример по Rubular: http://www.rubular.com/r/G5ctauWdYH
Попробуйте это, использует lookahead для перекрытий.
Обратите внимание, что идеальным является также использование переменной длины lookbehind, но Java ее не поддерживает.
# "((?:(?!\\bis\\b)\\S+\\s*){0,2})\\bis\\b\\s*(?=((?:(?!\\bis\\b)\\S+\\s*){0,2}))"
( # (1 start), 0-2 words before
(?:
(?! \b is \b ) # But, not the target word
\S+ \s*
){0,2}
) # (1 end)
\b is \b \s*
(?= # Lookahead, Overlap so next search starts here.
( # (2 start), 0-2 words after
(?:
(?! \b is \b ) # But, not the target word
\S+ \s*
){0,2}
) # (2 end)
)
Вывод:
** Grp 0 - ( pos 0 , len 11 )
if this is
** Grp 1 - ( pos 0 , len 8 )
if this
** Grp 2 - ( pos 11 , len 11 )
an example
---------------------------
** Grp 0 - ( pos 14 , len 16 )
example this is
** Grp 1 - ( pos 14 , len 13 )
example this
** Grp 2 - ( pos 30 , len 13 )
another one