java正则表达式匹配关键词周围的阿拉伯语单词,可能会在短距离内出现两次

时间:2014-12-27 15:25:00

标签: java regex

我试图使用正则表达式在某个关键词之前和之后匹配两个或更少的单词。文本是阿拉伯语的,所以我在java代码中的下面的表达式中使用\ S +来匹配阿拉伯字符。

我遇到一个关键词在同一个字符串中出现两次且距离小于或等于两个字的情况。

那么我怎么能编辑这个表达式来处理这种特殊情况。

阿拉伯语示例: 输入文字:اذا كان هذا مثال ودليل اذا هذا مثال اخر

正则表达式:((\S+\s*){0,2})\bهذا\b\s*((\S+\s*){0,2}) 需要提取第1组和第1组3。

预测输出:

  1. اذاكان - مثالودليل
  2. ودليلاذا - مثالاخر
  3. 实际输出:

    1. اذاكان - مثالودليل
    2. اذا - مثالاخر
    3. illustartion的英文示例:

      翻译文本:如果这是一个例子,这是另一个

      正则表达式:((\S+\s*){0,2})\bis\b\s*((\S+\s*){0,2}) 需要提取第1组和第1组3。

      预测输出:

      1. 如果这样 - 一个例子
      2. 示例 - 另一个
      3. 实际输出:

        1. 这是一个例子
        2. 这个 - 另一个
        3. Rubular示例:http://www.rubular.com/r/G5ctauWdYH

1 个答案:

答案 0 :(得分:1)

试试这个,使用前瞻为重叠。
请注意,理想情况是使用可变长度的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