通过Vim的Regex和globbing找到重复

时间:2009-10-07 15:43:02

标签: regex vim glob

如何找到至少30个数字的重复序列?

数据样本

2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547

我在Vim的尝试

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

此搜索找到5位数的重复。不幸的是,vim从5位数字的开头到重复结束时都会突出显示 - 包括之间的每个数字 - 这使得很难看出5位数是多少。另外,因为你的数字序列重复了很多,所以整个事情都会突出显示,因为一直有重复。

您可能会发现使用:set incsearch并输入/\(\d\{5\}\).\{-}\1/\(\d\{5\}\)\ze.\{-}\1 而不按Enter 会更有用,这样您就可以看到数字是什么。< / p>

此命令可能对您更有用:

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

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

答案 3 :(得分:0)

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

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

更新

我刚刚在纸上画了一个快速草图,沿着这些线条的东西可能在PCRE中起作用......但我还没有测试它,现在不能,但也许它会给你一些想法:

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

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

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

  1. 首先我要匹配一个30位数的序列,但我不想消耗它们,因为我想在下次检查1位数字(而不是30位)。因此,我使用捕获组来预测接下来的30位数字。
  2. 然后我消耗一位数以确保我与自己的30位数字不匹配。
  3. 然后我使用非贪婪的量词匹配至少29位数(这意味着我将在当前数字序列之外的数字上开始),以便它将尝试30,然后是31,等等。
  4. 然后我匹配我正在测试的30位数字。如果它们在序列的后面存在,则正则表达式将成功;否则,它会失败。

答案 4 :(得分:0)

此命令将匹配123451234但不是111111111

的行
:g/\(\d\{4}\)\1\@!.\1/
  • \1\@!.使用否定前瞻说“确保此位置与第1组(\@!)不匹配(\1),然后使用字符. )“