3

你怎么能找到至少 30 个数字的重复序列?

数据样本

2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547

我在 Vim 中的尝试

:g/\(\d\{4}\)\[^\1\]\1/
                |
                |----------- Problem here!

我不知道你怎么能否定第一个 glob。

4

5 回答 5

4

首先,要找到您的重复号码,您可以使用这个简单的搜索:

/\(\d\{5\}\).\{-}\1

此搜索找到 5 个数字的重复项。不幸的是,vim 会突出显示从 5 位数字的开头到重复的结尾——包括中间的每个数字——这使得很难看出 5 位数字是什么。此外,因为你的数字序列重复了很多,整个事情都被突出显示,因为从头到尾都有重复。

:set incsearch您可能会发现使用和键入/\(\d\{5\}\).\{-}\1/\(\d\{5\}\)\ze.\{-}\1 不按回车键更有用,这样您就可以看到数字是什么。

此命令可能对您更有用:

:syn region repeatSection matchgroup=Search start=/\z(\d\{30}\)/ matchgroup=Error end=/\z1/ oneline

这将突出显示黄色(第一次看到)或红色(重复时)的 30 位数字序列。请注意,这仅适用于单行文本(多行是不可能的)。

于 2009-10-08T07:50:24.140 回答
3

怎么样:g/\(\d\{30,\}\{2,\}\)/

于 2009-10-07T15:47:10.073 回答
2

我不确定你为什么需要否定。/\(\d\{4\}\)\1/将匹配(完全)四个数字的序列,重复一次。您可能实际上想要/\(\d\{30,\}\)\1/获得“至少 30 岁”之类的东西。这似乎对我有用,除非我误解了您要搜索的内容。请注意,由于正则表达式是贪婪的,因此您将获得最长的重复序列。

于 2009-10-07T15:49:17.990 回答
0

如果它对您有所帮助,那么确保以下字符集与反向引用#1 中存储的字符不同的适当方法是(?!\1). 请注意,(?!)(负前瞻)组是一个零宽度断言(即,它不会改变光标的位置,它只是检查正则表达式是否应该失败。)

您使用的正则表达式引擎是否支持这一点,我不知道。

更新

我刚刚在纸上做了一个速写,沿着这些思路可能会在 PCRE 中工作......但我还没有测试它,现在不能,但也许它会给你一些想法:

(?=(\d{30}))\d(?=\d{29,}?\1)

为确保我正确理解您,上述正则表达式的目的是匹配任何 30 位数字的序列,该序列也存在于被搜索的整个字符串中。

我对上述正则表达式的想法是:

  1. 首先,我想匹配一个 30 位数字的序列,但我不想消耗它们,因为我想下次检查 1 位数字(不是 30 位)。因此,我对存储接下来的 30 位数字的捕获组使用前瞻。
  2. 然后我消耗一位数字以确保我不会将这 30 位数字与他们自己匹配。
  3. 然后我用非贪婪量词匹配至少 29 个数字(这意味着我将从当前数字序列之外的数字开始),这样它就会尝试 30,然后是 31,等等。
  4. 然后我匹配我目前正在测试的 30 位数字。如果它们在序列的后面存在,则正则表达式将成功;否则,它将失败。
于 2009-10-07T15:47:15.390 回答
0

此命令将匹配行123451234但不匹配111111111

:g/\(\d\{4}\)\1\@!.\1/
  • \1\@!.使用否定前瞻来表示“确保此位置不匹配 ( \@!) 组 1 ( \1),然后使用字符 ( .)”
于 2009-10-07T20:59:30.190 回答