JS如何实现字符串精准匹配子串,避免匹配到含多余字符的内容?
问题原因
你当前使用includes做子串匹配的逻辑存在漏洞:判断是否包含-${symbol}时,-USD刚好是-USDT的前缀,会被误判为匹配成功,才会出现USD分类下混入USDT交易对的问题。
解决方案
推荐优先使用字符串拆分完全匹配的方案,逻辑更直观,不存在正则转义风险:
var symbols = ['ETH', 'BTC', 'USD', 'USDT']; var marketPairs = ['AAVE-USD', 'AAVE-USDT', 'AAVE-BTC', 'AAVE-ETH']; var marketDict = {}; for (let i = 0; i < symbols.length; i++) { const currentSymbol = symbols[i]; marketDict[currentSymbol] = []; for (let j = 0; j < marketPairs.length; j++) { const pair = marketPairs[j]; // 按分隔符拆分交易对为两个独立币种 const [baseCoin, quoteCoin] = pair.split('-'); // 完全匹配任意一段即可加入对应分类 if (baseCoin === currentSymbol || quoteCoin === currentSymbol) { marketDict[currentSymbol].push(pair); } } }
如果你不想拆分字符串,也可以用正则限定匹配边界,确保目标符号要么在交易对开头且后缀为-,要么在交易对结尾且前缀为-,实现精确匹配:
var symbols = ['ETH', 'BTC', 'USD', 'USDT']; var marketPairs = ['AAVE-USD', 'AAVE-USDT', 'AAVE-BTC', 'AAVE-ETH']; var marketDict = {}; for (let i = 0; i < symbols.length; i++) { const currentSymbol = symbols[i]; marketDict[currentSymbol] = []; // 构造带边界限定的正则 const matchReg = new RegExp(`(^${currentSymbol}-)|(-${currentSymbol}$)`); for (let j = 0; j < marketPairs.length; j++) { const pair = marketPairs[j]; if (matchReg.test(pair)) { marketDict[currentSymbol].push(pair); } } }
两种方案运行后,marketDict['USD']的结果都只有['AAVE-USD'],不会混入USDT相关的交易对。
内容的提问来源于stack exchange,提问作者Mr. Goose
相关产品推荐
相关产品推荐

