正则表达式识别多行文本中连续和非连续的重复词

J-A*_*lex 0 java regex

我正在为具有关键字和逗号(分隔)/分号(EOL)分隔值的文件编写语法检查器(在 Java 中)。两个完整结构之间的空间量未指定。

需要什么:

在多行文件中查找任何重复的单词(连续和非连续)。

// Example_1 (duplicate 'test'):
item1  , test, item3   ;
item4,item5;
test , item6;

// Example_2 (duplicate 'test'):
item1  , test, test   ;
item2,item3;
Run Code Online (Sandbox Code Playgroud)

我尝试应用该(\w+)(s*\W\s*\w*)*\1模式,但该模式无法正确捕获重复项。

anu*_*ava 7

您可以将此正则表达式与模式DOTALL(单行)一起使用:

(?s)(\b\w+\b)(?=.*\b\1\b)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

正则表达式详情:

  • (?s): 启用DOTALL模式
  • (\b\w+\b):匹配一个完整的单词并在第 1 组中捕获它
  • (?=.*\b\1\b): Lookahead 断言我们在前面\1某处存在反向引用。\b用于确保我们再次匹配完全相同的单词。

此外:

根据下面之前的评论,如果意图不匹配像 那样的连续单词重复item1 item1,则可以使用以下正则表达式:

(?s)(\b\w+\b)(?!\W+\1\b)(?=.*\b\1\b)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 2

这里有一个额外的否定前瞻断言,以确保我们不匹配连续的重复。

  • (?!\W+\1\b):连续重复失败的负前瞻。