[英]Comparing two RegEx objects in Node.js
我正在使用 NodeRED 对从 Microsoft Azure 认知服务上的图像分析 (OCR) 创建的字符串执行一些逻辑。 图像分析不允许任何模式匹配/输入模式。
生成的字符串(我们称它为“A”)有时会略微错误地解释字符,典型的是“l”=“1”或“s”=“5”。
生成的字符串可以是仅有的几种不同格式之一,为了争论起见,可以说:
我需要做的是确定解释后的字符串 ('A') 最接近于('1'、'2' 或 '3')的格式。 一旦确定了这一点,我就计划调整被误解的字符,并希望留下一个(接近)完美的字符串。
我最初的计划是将“A”转换为 RegEx - 所以如果“A”返回为“12345”,我会将其更改为 RegEx object [1|l][2|z]34[5|s],比较这个 object 到 RegEx 对象,希望一个会作为匹配返回。
实际上,解释后的字符串更像是 8 个字母数字和五个不同的(相当复杂的)RegEx 可能性,但为了这个问题的目的,我试图简化问题。
所以问题是:是否可以通过这种方式比较 RegEx? 有没有人对如何改进这种图像分析有任何其他建议?
谢谢
这是一个使用笛卡尔积来比较字符串以寻找可能匹配项的解决方案。 测试字符串是'abclz'
,可以匹配pattern1
或pattern2
:
const cartesian = (...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat()))); const charMapping = { '1': ['1','l'], 'l': ['1','l'], '2': ['2','z'], 'z': ['2','z'], '5': ['5','s'], 's': ['5','s'] }; const buckets = { pattern1: /^[az]{4,5}$/, pattern2: /^[ag]{3}[0-9]{1,2}$/, pattern3: /^[0-9][az]{4}$/ }; const input = 'abclz'; console.log('input:', input); let params = input.split('').map(c => charMapping[c] || [c]); let toCompare = cartesian(...params).map(arr => arr.join('')); console.log('toCompare:', toCompare); let potentialMatches = toCompare.flatMap(str => { return Object.keys(buckets).map(pattern => { let match = buckets[pattern].test(str); console.log(str, pattern + ':', match); return match? str: null; }).filter(Boolean); }); console.log('potentialMatches:', potentialMatches);
Output:
input: abclz
toCompare: [
"abc12",
"abc1z",
"abcl2",
"abclz"
]
abc12 pattern1: false
abc12 pattern2: true
abc12 pattern3: false
abc1z pattern1: false
abc1z pattern2: false
abc1z pattern3: false
abcl2 pattern1: false
abcl2 pattern2: false
abcl2 pattern3: false
abclz pattern1: true
abclz pattern2: false
abclz pattern3: false
potentialMatches: [
"abc12",
"abclz"
]
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.