Regex 通过Vim'发现重复;s正则表达式和globbing
如何找到至少30个数字的重复序列? 数据样本Regex 通过Vim'发现重复;s正则表达式和globbing,regex,vim,glob,Regex,Vim,Glob,如何找到至少30个数字的重复序列? 数据样本 2.375854214123006833712984054669703872437357630979498861047835990888382687927107061503416856492027334851936218678815489749430523917995444191343963553530751708428246013667425968109339407744874715261958997722095671981776765375854
2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547
我在维姆的尝试
:g/\(\d\{4}\)\[^\1\]\1/
|
|----------- Problem here!
我不知道你怎么能得到第一个glob的否定。那么
:g/\(\d\{30,\}{2,\}\)/
?如果它能帮助你,那么确保以下字符集与存储在后引用中的字符集不同的适当方法是(?!\1)
。请注意,(?!)
(负向前看)组是一个零宽度断言(即,它不会更改光标的位置,它只是检查正则表达式是否应失败。)
我不知道你使用的正则表达式引擎是否支持这一点
更新
我只是在纸上画了一个草图,沿着这条线的一些东西可能会在PCRE中起作用。。。但我还没有测试过,现在也不能,但也许它会给你一些想法:
(?=(\d{30}))\d(?=\d{29,}?\1)
为了确保我正确理解了您的意思,上面正则表达式的目的是匹配稍后在整个搜索字符串中也存在的任何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,\}/
没有帮助。你想要什么有点不清楚。你谈论寻找重复的角色,但你却试图否定某些东西。