如何找到至少30个数字的重复序列?
数据样本
2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547
我在Vim的尝试
:g/\(\d\{4}\)\[^\1\]\1/
|
|----------- Problem here!
我不知道你怎么能否定第一个glob。
答案 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位数字序列。
我对上述正则表达式的看法是:
答案 4 :(得分:0)
此命令将匹配123451234
但不是111111111
:g/\(\d\{4}\)\1\@!.\1/
\1\@!.
使用否定前瞻说“确保此位置与第1组(\@!
)不匹配(\1
),然后使用字符.
)“