Regex 通过Vim'发现重复;s正则表达式和globbing

Regex 通过Vim'发现重复;s正则表达式和globbing,regex,vim,glob,Regex,Vim,Glob,如何找到至少30个数字的重复序列? 数据样本 2.375854214123006833712984054669703872437357630979498861047835990888382687927107061503416856492027334851936218678815489749430523917995444191343963553530751708428246013667425968109339407744874715261958997722095671981776765375854

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

数据样本

2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547
我在维姆的尝试

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

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

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

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

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

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

(?=(\d{30}))\d(?=\d{29,}?\1)
为了确保我正确理解了您的意思,上面正则表达式的目的是匹配稍后在整个搜索字符串中也存在的任何30位数字序列

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

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

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

    此命令将与
    123451234
    匹配,但与
    111111111

    :g/\(\d\{4}\)\1\@!.\1/
    
    • \1\@
      使用负前瞻表示“确保此位置不匹配(
      \@!
      )组1(
      \1
      ),然后使用字符(
      )”

    首先,要查找重复编号,您可以使用以下简单搜索:

    /\(\d\{5\}\).\{-}\1
    
    此搜索查找5位数的重复。不幸的是,vim从5位数字的开始到重复的结束都会高亮显示(包括中间的每个数字),这使得很难看到5位数字是什么。另外,因为你的数字序列重复了很多次,所以整个事情都会突出显示,因为一路上都有重复

    您可能会发现使用
    :设置incsearch
    并键入
    /\(\d\{5\}\)。{-}\1
    /\(\d\{5\}\)\ze.{-}\1
    ,而不按enter,这样您就可以看到数字是什么

    此命令可能对您更有用:

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

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

    vim regex支持前瞻,但不使用该语法。这不会找到重复序列。它的目的是什么?对你来说“发现”意味着什么?我很确定它是这样的(它和我的一样,只是匹配任意多个重复)。当然,您可能希望在前面不带:g的情况下尝试它-您是在尝试查找它们,而不是在包含它们的行上运行命令。啊,如果重复序列必须相邻(这是有意义的),那么这个正则表达式肯定可以完成这项工作。@Chaos:您是如何在示例数据中提取重复序列的?-我在比赛中把一切都突出了数据应至少包含四个约400个字符的相同序列。这个
    :g/\d\{400,\}{2,\}/
    没有帮助。你想要什么有点不清楚。你谈论寻找重复的角色,但你却试图否定某些东西。