如何检查字符串是否仅含指定完整子串与空格?求非正则实现方案
问题:判断字符串是否仅包含指定完整子串与空格,无需复杂正则
我想要测试一个字符串是否仅包含指定的子串(作为完整单词)和空格。我已经写了一段可运行的JavaScript代码,但对其中复制来的正则表达式不太理解,想问有没有不用复杂正则的实现方式?
原代码示例
const str1 = 'a♭ apple a a a a a apple a♭ a'; // valid const str2 = 'a♭ apple a a a a a apple a♭ aa'; // invalid aa const str3 = 'a♭ apple ad a a a apple a♭ a'; // invalid ad const str4 = ' a♭ apple a a a a a apple a♭ a'; // valid const str5 = ' a♭ apple a a a a a apple a♭ a '; // valid const str6 = 'a♭ apple a a a a a apple a♭ a '; // valid const str7 = ' '; // invalid const str8 = ''; // invalid const allowedSubstrings = [ 'a', 'a♭', 'apple' ] const isStringValid = str => { if (str.trim() === '') return false allowedSubstrings.forEach(sub => { // 用于匹配完整单词的正则 const strRegex = `(?<!\S)${sub}(?!\S)` const regex = new RegExp(strRegex, 'g') str = str.replace(regex, '') }) str = str.replaceAll(' ', '') return str === '' } console.log('str1', isStringValid(str1)) console.log('str2', isStringValid(str2)) console.log('str3', isStringValid(str3)) console.log('str4', isStringValid(str4)) console.log('str5', isStringValid(str5)) console.log('str6', isStringValid(str6)) console.log('str7', isStringValid(str7)) console.log('str8', isStringValid(str8))
无需正则的实现方案
核心思路很简单:把字符串拆分成独立的单词(自动忽略多余空格),然后检查每个单词是否都在允许的子串列表里。
实现代码
const str1 = 'a♭ apple a a a a a apple a♭ a'; // valid const str2 = 'a♭ apple a a a a a apple a♭ aa'; // invalid aa const str3 = 'a♭ apple ad a a a apple a♭ a'; // invalid ad const str4 = ' a♭ apple a a a a a apple a♭ a'; // valid const str5 = ' a♭ apple a a a a a apple a♭ a '; // valid const str6 = 'a♭ apple a a a a a apple a♭ a '; // valid const str7 = ' '; // invalid const str8 = ''; // invalid const allowedSubstrings = ['a', 'a♭', 'apple'] const isStringValid = (str) => { // 空字符串或全空格直接判定无效 const trimmed = str.trim(); if (trimmed === '') return false; // 按任意数量的空格分割,得到所有非空单词 const words = trimmed.split(/\s+/); // 检查每个单词是否都在允许列表中 return words.every(word => allowedSubstrings.includes(word)); } console.log('str1', isStringValid(str1)) console.log('str2', isStringValid(str2)) console.log('str3', isStringValid(str3)) console.log('str4', isStringValid(str4)) console.log('str5', isStringValid(str5)) console.log('str6', isStringValid(str6)) console.log('str7', isStringValid(str7)) console.log('str8', isStringValid(str8))
方案优势
- 逻辑直白:不用理解正则里的
(?<!\S)和(?!\S)这类断言语法,拆分单词后逐个校验的逻辑一目了然 - 易于维护:如果允许的子串需要修改,直接调整
allowedSubstrings数组即可,不用修改正则规则 - 性能更可控:避免了多次正则替换的开销,拆分和遍历的逻辑性能更稳定
内容的提问来源于stack exchange,提问作者danday74
相关产品推荐
相关产品推荐

