You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查字符串是否仅含指定完整子串与空格?求非正则实现方案

问题:判断字符串是否仅包含指定完整子串与空格,无需复杂正则

我想要测试一个字符串是否仅包含指定的子串(作为完整单词)和空格。我已经写了一段可运行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:35:27