java正则表达式匹配可能在短距离内出现两次的关键字周围的阿拉伯语单词
我正在尝试使用正则表达式在某个关键字前后匹配两个或更少的单词。文本是阿拉伯语的,因此我在下面的java代码表达式中使用了\S+,以匹配阿拉伯语字符 我遇到了这样一个例子:关键字在同一个字符串中出现两次,距离小于或等于两个单词 那么我如何编辑这个表达式来处理这种特殊情况呢 阿拉伯文示例: 输入文本:java正则表达式匹配可能在短距离内出现两次的关键字周围的阿拉伯语单词,java,regex,Java,Regex,我正在尝试使用正则表达式在某个关键字前后匹配两个或更少的单词。文本是阿拉伯语的,因此我在下面的java代码表达式中使用了\S+,以匹配阿拉伯语字符 我遇到了这样一个例子:关键字在同一个字符串中出现两次,距离小于或等于两个单词 那么我如何编辑这个表达式来处理这种特殊情况呢 阿拉伯文示例: 输入文本: 正则表达式:((\S+\S*){0,2})\bهذا\b\S*(\S+\S*){0,2}) 需要提取第1组和第3组 预计产量: ا㶉㶌ن-㶏㶊ودلل 实际产量: ا㶉㶌ن-㶏㶊ودلل Illu
正则表达式:((\S+\S*){0,2})\bهذا\b\S*(\S+\S*){0,2})
需要提取第1组和第3组
预计产量:
ا㶉㶌ن-㶏㶊ودلل
实际产量:
ا㶉㶌ن-㶏㶊ودلل
Illustart的英文示例:
如果这是一个例子,这是另一个例子
正则表达式:((\S+\S*){0,2})\bis\b\S*((\S+\S*){0,2})
需要提取第1组和第3组
预计产量:
如果这是一个例子
这个例子是另一个例子
实际产量:
这是一个例子
这个另一个
Rubular上的示例:试试这个,对重叠使用前瞻。
请注意,理想的方法是使用可变长度的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
你需要使用lookaheads或lookbehinds来进行重叠匹配。由于这个问题似乎不是特定于阿拉伯语的,我认为在这里不提及它会更清楚(更简短)all@Dici:我提到了使用\S而不是\w+的理由,因为\w+无法匹配阿拉伯语chars@Daisy哦,对了,谢谢你的精确性