我想从数千个列表中找到具有模式的数字,并且我想匹配以下内容:
在这样的 JSON 对象中:
["ok", {"series/020" : ["02034353637", "02034445673", "02034147369", "02034653185"]}]
Run Code Online (Sandbox Code Playgroud)
所以所有这些都会匹配;例如,第一个有 34 35 36,第二个有 444 和 567,最后一个有 147 和/或 369,等等。
我尝试了什么?好吧,大多数网站都在右边那个小盒子里烦我!堆栈溢出搜索。一些在线书籍...但当我发现这本142 页的书时,我开始怀疑是否存在“正则表达式阅读障碍”(regexia?)之类的东西,或者可能只是厚度。我知道我什么时候被打败。
事后看来,在 Google Sheets 自动填充的帮助下手动进行“数组搜索数组”也许会更快、更容易,但这有可能吗?
最后,是否有一个“付给我 10 美元,我会为你做你的正则表达式”的网站?如果没有,他们应该是!他们会赚大钱的!谢谢。
您可以将 is 写为一个正则表达式,但为了便于阅读,我将其保留为:
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)
}Run Code Online (Sandbox Code Playgroud)
Test a number:
<input type="text" /> <span></span>Run Code Online (Sandbox Code Playgroud)