我想从数千个列表中找到具有模式的数字,并且我想匹配如下内容:
- 3 个或更多的序列,任一方向 (345,2345,876)
- 重复序列 (2233,3355,77777) 147,258,369 或它们的反序列。
- 重复模式 (373737,33773377)
在这样的 JSON 对象中:
["ok", {"series/020" : ["02034353637", "02034445673", "02034147369", "02034653185"]}]
所以所有这些都会匹配;例如,第一个有 34 35 36,第二个有 444 和 567,最后一个有 147 和/或 369,等等。
我尝试了什么?好吧,那个小盒子里的大多数网站都在右边唠叨我!计算器搜索。一些在线书籍……但当我找到 142 page book 时,我开始怀疑是否存在“正则表达式阅读障碍”(regexia?)之类的东西,或者它可能只是厚度。我知道我什么时候被击败。
事后看来,在 Google 表格自动填充的帮助下手动构建模式的“数组搜索数组”可能会更快更容易,但这是否可能呢?
最后,有没有“付我 10 美元,我会为你做正则表达式”的网站?如果不是,他们应该是!他们会赚大钱的!谢谢。
最佳答案
你可以把它写成一个正则表达式,但为了便于阅读,我把它留成这样:
var data = ["ok", {
"series/020": [
"02034353637", "02034445673", "02034147369", "02034653185",
"345", "2345", "876",
"2233", "3355", "77777",
"147", "258", "369",
"373737", "33773377",
]
}]
var numbers = data[1]["series/020"]
var patternNumbers = numbers.filter(isPatternNumber)
// Demo output
document.write("<pre>" + JSON.stringify(patternNumbers, null, "\t") + "</pre>")
document.write("Matched " + patternNumbers.length + " out of " + numbers.length)
function isPatternNumber(n) {
// constant pattern
if (/147|258|369/.test(n)) return true
// repeating pattern 3+
if (/(?=(\d))\1{3,}/.test(n)) return true
// sequence asc 3+
if (/012|123|234|345|456|567|678|789/.test(n)) return true
// sequence desc 3+
if (/987|876|765|654|543|432|321/.test(n)) return true
// repeating double sequence xxyy (note that x=y is possible, same as 4 in a row)
if (/(?=(\d))\1{2}(?=(\d))\2{2}/.test(n)) return true
// alternerting pattern xyxy (note that x=y is possible, => same as 4 in a row)
if (/(?=(\d))\1{1}(?=(\d))\2{1}(?=(\d))\1{1}(?=(\d))\2{1}/.test(n)) return true
return false
}
// Demo Input
var input = document.getElementsByTagName("input")[0]
var output = document.getElementsByTagName("span")[0]
input.oninput = function() {
output.textContent = isPatternNumber(input.value)
}
Test a number:
<input type="text" /> <span></span>
关于javascript - 用于查找电话号码中重复模式的正则表达式?或许不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695508/