我想测试一个字符串是否仅包含特定子字符串(作为完整单词)和空格。
我已经编写了一些代码,它能够正常工作,但我担心自己并不完全理解其中的正则表达式(我从其他地方复制来的)。是否存在不使用复杂正则的方法来实现这一目标呢?
以下是你提供的JavaScript代码及其功能描述:
const str1 = 'a♭ apple a a a a a apple a♭ a'; // 有效
const str2 = 'a♭ apple a a a a a apple a♭ aa'; // 无效,因为包含"aa"
const str3 = 'a♭ apple ad a a a apple a♭ a'; // 无效,因为包含"ad"
const str4 = ' a♭ apple a a a a a apple a♭ a'; // 有效,开头的空格不影响结果
const str5 = ' a♭ apple a a a a a apple a♭ a '; // 有效,结尾的空格不影响结果
const str6 = 'a♭ apple a a a a a apple a♭ a '; // 有效
const str7 = ' '; // 无效,仅包含空格
const str8 = ''; // 无效,为空字符串
const allowedSubstrings = [
'a', 'a♭', 'apple'
];
const isStringValid = (str) => {
if (str.trim() === '') return false; // 如果字符串为空或只包含空格,则返回false
allowedSubstrings.forEach((sub) => {
// 此处的正则表达式用于匹配整个单词:(?<!\S)前向否定查找断言,确保前面没有非空字符;(?!\\S)后向否定查找断言,确保后面没有非空字符
const strRegex = `(?<!\\S)${sub}(?!\\S)`;
const regex = new RegExp(strRegex, 'g');
str = str.replace(regex, '');
});
str = str.replaceAll(' ', ''); // 移除所有空格
// console.log(str);
return str === ''; // 如果移除允许的子字符串和空格后,字符串为空,则返回true
};
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));