регулярное выражение java, соответствующее арабским словам вокруг ключевого слова, которое может встречаться дважды на небольшом расстоянии

1

Я пытаюсь совместить два слова или меньше до и после определенного ключевого слова с использованием регулярного выражения. Текст на арабском языке, поэтому я использовал \S+ в приведенном ниже выражении в Java-коде, чтобы соответствовать арабским символам.

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

Итак, как я могу отредактировать это выражение для обработки такого особого случая.

Арабский Пример: ввод текста: اذا كان هذا مثال ودليل اذا هذا مثال اخر

regex: ((\S+\s*){0,2})\bهذا\b\s*((\S+\s*){0,2}) необходимо извлечь группу 1 и 3.

прогнозируемый результат:

  1. اذا كان - مثال ودليل
  2. ودليل اذا - مثال اخر

фактический результат:

  1. اذا كان - مثال ودليل
  2. اذا - مثال اخر

Пример на английском языке для иллюстраций:

переведенный текст: если это пример, это еще один

regex: ((\S+\s*){0,2})\bis\b\s*((\S+\s*){0,2}) необходимо извлечь группу 1 и 3.

прогнозируемый результат:

  1. если это - пример
  2. пример это - еще один

фактический результат:

  1. это это - пример
  2. это - другое

Пример по Rubular: http://www.rubular.com/r/G5ctauWdYH

  • 0
    Вам нужно использовать предпросмотр или порядок следования за взглядом, чтобы перекрывать совпадения.
  • 0
    Так как проблема не кажется специфичной для арабского языка, я думаю, что было бы яснее (и короче) не упоминать ее вообще
Показать ещё 2 комментария
Теги:

1 ответ

1
Лучший ответ

Попробуйте это, использует 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню