如果其中一个不完全相等,我该如何匹配字符串?

Posted

技术标签:

【中文标题】如果其中一个不完全相等,我该如何匹配字符串?【英文标题】:how can i match strings, if one of them are not complete equal? 【发布时间】:2021-12-09 04:23:19 【问题描述】:

我有两个数组,我想验证两个数组是否同步,如果两个数组中存在相同的名称,应该存储在数组中,而其他的则没有

例如:我需要名称为 rea.jpg 的所有对象,但在我的数组中我有这样的 ['dsjajdsj...h2/rea.jpg'] 这是材料

[name: 'hgb.jpg' ,  name: 'rea.jpg',   name: 'ca.png' ]

文件扩展名始终是字符串的结尾

我想验证名称数组中是否存在对象

const names = ['h2/rea.jpg']
const materials = [
  name: 'hgb.jpg'
, 
  name: 'rea.jpg'
, 
  name: 'ca.png'
]
const res = materials.filter(x => names.includes(x.name))
console.log('RES', res)

预期结果应该是[ name: 'rea.jpg']

【问题讨论】:

您的 names 数组具有完全限定的文件名(带路径),我假设您不想比较路径组件,只比较文件名,那么为什么不创建第二个数组只有来自names 的文件名?然后您的过滤器代码将起作用。 @jarmod 我怎样才能在不使用这个字符 / 的情况下创建名称列表? 见***.com/questions/19811541/… @jarmod 我不想安装一个库或者除非它太必要? @jarmod ProGu 的答案可以在所有情况下工作吗? 【参考方案1】:

使用Array#some 传入自定义比较函数。

const names = ['h2/rea.jpg']
const materials = [
  name: 'hgb.jpg'
, 
  name: 'rea.jpg'
, 
  name: 'ca.png'
]
const res = materials.filter(x => names.some(y => y.endsWith('/' + x.name)))
console.log('RES', res)

【讨论】:

会错误匹配law/mens-rea.jpg 修改为添加前导/ 如果names数组元素总是包含路径,更新后的代码就OK了。 原来的问题是这么说的 如果名称和材料不固定,则无解。【参考方案2】:
const names = ['h2/rea.jpg']
const materials = [
  name: 'hgb.jpg'
, 
  name: 'rea.jpg'
, 
  name: 'ca.png'
]
const res = materials.filter(x => 
    const ni = names.filter(ni => ni.includes(x.name))
    return ni.length > 0
)
console.log(res)

但是,如果名称很长并且您不想在材料的每个元素上对其进行迭代,请遵循其他建议并将名称转换为仅包含文件名。

const fnames = names.map(ni => ni.split('/')[ni.split('/').length-1])
const res = materials.filter(x => names.includes(x.name))
console.log(res)

【讨论】:

【参考方案3】:

在过滤器内部使用some 来实现这一点(注意,这将在 O(n^2) 中运行)。

const names = ['h2/rea.jpg']
const materials = [
  name: 'hgb.jpg'
, 
  name: 'rea.jpg'
, 
  name: 'ca.png'
]
const res = materials.filter(x => names.some(y => y.endsWith('/' + x.name)))

console.log('RES', res)

【讨论】:

【参考方案4】:

假设这是 Node.js,您可以使用 path 库将完全限定的路径名​​转换为简单的文件名,然后进行包含测试。例如:

const path = require('path');

const pathnames = ['h2/rea.jpg'];
const filenames = pathnames.map((x) => path.basename(x));

const materials = [
  
    name: 'hgb.jpg',
  ,
  
    name: 'rea.jpg',
  ,
  
    name: 'ca.png',
  ,
];

const res = materials.filter((x) => filenames.includes(x.name));
console.log('RES', res);
// RES [  name: 'rea.jpg'  ]

【讨论】:

【参考方案5】:

如果你喜欢 oldscool,那么使用两个循环和正则表达式。

const names = ['h2/rea.jpg']
const materials = [
    name: 'hgb.jpg'
  , 
  
    name: 'rea.jpg'
  , 
  
    name: 'ca.png'
  ]

  const res = [];

materials.forEach((x) => 
    let search = x.name    
    let reg = new RegExp(search, 'g');
    let match = '';
    names.forEach((n) => 
      match = n.match(reg);
    )
    if(match) 
      res.push(x)
      
)

console.log('RES', res)

【讨论】:

以上是关于如果其中一个不完全相等,我该如何匹配字符串?的主要内容,如果未能解决你的问题,请参考以下文章

字符串暴力匹配算法详解

Horspool 字符串匹配算法

数据结构与算法——字符串匹配问题(KMP算法)

如果字符串完全符合定义,则匹配正则表达式

FFT字符串匹配

C语言 判断两个集合是不是相等