比较Node.js中的两个RegEx对象

d6kp6zgx  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(115)

我正在使用NodeRED对通过Microsoft Azure认知服务上的图像分析(OCR)创建的字符串执行一些逻辑。图像分析不允许任何模式匹配/输入模式。
结果字符串(我们称之为'A')有时会对字符的解释稍有错误,典型的情况是'l'='1'或's'='5'。
生成的字符串可以是少数几种不同格式中的一种,为了便于讨论,我们假设:
1.[a-z] {4,5}
1.[a-g] {3} [0 - 9] {1,2}
1.[0 - 9][a-z] {4}
我需要做的是确定被解释的字符串('A ')与哪种格式(' 1 ',' 2 '或' 3')最接近。一旦我确定了这一点,我计划调整被误解的字符,并希望留下一个(接近)完美的字符串。
我最初的计划是将"A"转换为RegEx-因此,如果"A"返回为"12345",我将其更改为RegEx对象[1|[2]|z] 34 [5|s],将此对象与RegEx对象进行比较,希望有一个匹配。
实际上,被解释的字符串更像是8个字母数字和5个不同的(相当复杂的)RegEx可能性,但我已经尝试简化这个问题。
所以问题是:有没有可能用这种方式来比较RegEx?有没有人对如何改进这种图像分析有任何其他的建议?
谢谢

qxsslcnc

qxsslcnc1#

下面是一个使用笛卡尔积比较字符串可能匹配的解决方案。测试字符串是'abclz',它可以匹配pattern1pattern2

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: /^[a-z]{4,5}$/,
  pattern2: /^[a-g]{3}[0-9]{1,2}$/,
  pattern3: /^[0-9][a-z]{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);

输出:

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"
]

相关问题