正则表达式匹配重复字符串?

时间:2021-06-17 06:47:42

标签: regex

我有一个行数据集,由于代码错误,其中的字符串重复了一次或多次。数据以大写开头,通常有多个单词,然后字符串重复。有些线路没问题,没有重复测试。例如,数据可能是

The quick brown ox jumps over the lazy dogThe quick brown fox jumps over the lazy dog
ApplesApplesApples
IBM AT Computer
Lamp ShadeLamp Shade
OrangesOranges
I am a Potato

我发现了多个正则表达式来查找重复的,这些停在预定义的边界 \b\w - 这很容易。

查找具有内置边界条件(例如 i am i am a potato)的静态长度的重复短语(例如,两个重复的单词,如 \w)也相对容易。我找到了这样的例子,例如 \b(\w+(?:\s*\w*))\s+\1\b(演示 https://regex101.com/r/4UIrxu/2)。如果在 i am i am i am a potato 中有 3 次重复,则失败,并且只会找到第一次出现。

我的词组包含一个或多个词,因此上述词组匹配器不起作用。

是否可以告诉表达式它的 boundary 是我组成的条件 - 就像一个小写字母后跟一个大写字母(如 T 中的 dogThe ) - 我可以用 \B[a-z][A-Z]\B 来做 - 然后可以用作标记来测试是否重复了前一部分?我无法使用此边界条件修改重复短语模式,但也许仍然可以。

1 个答案:

答案 0 :(得分:1)

这很简单,但可能会提供一个开始:

/([A-Z].*)\1{1,}

https://regex101.com/r/ynfuCO/1

这里引入了边界条件:

/(?:^|(?<=[a-z]))([A-Z].*)\1{1,}

我已经包括了行首以及小写/大写边界,因为这似乎符合您的要求。见https://regex101.com/r/PBFDPY/2

(?<=[a-z]) 部分是一个正向后视(参见例如 https://www.regular-expressions.info/lookaround.html),它检查小写字母。您可能需要调整字符类(为了简单起见,我刚刚使用了 [a-z],但这通常是不够的)。