需求:仅当字符串包含全部4个指定单词时匹配的正则表达式
如何用正则(或更优方案)检查并返回全部指定关键词
嘿,我明白你的需求了——只有当字符串里同时包含Update、Rollback、Skip、Not Now这四个词(你的示例里其实是JSON的键)时,才返回这四个词,缺一个就啥都不返回对吧?
首先说你写的正则问题:(Update|Rollback|Skip|Not Now)这个表达式只会匹配任意一个存在的词,不管其他三个是否存在,完全达不到“四个都要有才返回”的要求。下面给你两种解决方案,一种是正则实现,另一种是更靠谱的非正则方案(你也提到正则可能不是最优选择)。
一、正则实现方案
要实现“必须同时存在四个词才匹配”,我们需要用到正向预查(Positive Lookahead),它能在不消耗字符的前提下,检查整个字符串里是否存在指定模式。
1. 验证四个词是否全部存在的正则
这个正则用来判断字符串是否满足“四个词都存在”的条件:
^(?=.*Update)(?=.*Rollback)(?=.*Skip)(?=.*Not Now).*$
^和$匹配字符串的开头和结尾,确保检查覆盖整个字符串(?=.*Update):检查字符串任意位置存在Update- 另外三个预查同理,分别验证
Rollback、Skip、Not Now的存在 - 只有四个预查全部通过,整个正则才会匹配成功
2. 提取目标词
当上面的正则验证通过后,再用全局匹配提取所有目标词:
Update|Rollback|Skip|Not Now
加上全局标志(比如JavaScript里的g,Python里的re.findall)就能得到包含四个词的数组。
示例(JavaScript):
const str1 = '{"Update":"iVBORw0KGgo","Rollback":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}'; const str2 = '{"Update":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}'; const validateRegex = /^(?=.*Update)(?=.*Rollback)(?=.*Skip)(?=.*Not Now).*$/; const extractRegex = /Update|Rollback|Skip|Not Now/g; // 处理示例1 if (validateRegex.test(str1)) { console.log(str1.match(extractRegex)); // 输出: ["Update", "Rollback", "Skip", "Not Now"] } else { console.log([]); } // 处理示例2 if (validateRegex.test(str2)) { console.log(str2.match(extractRegex)); } else { console.log([]); // 输出: [] }
二、更优的非正则方案(推荐)
因为你的输入是JSON格式,直接解析JSON然后检查键是否存在会更准确、更易维护,不会出现正则可能的误判(比如某个值里包含关键词但键不存在的情况)。
示例(JavaScript):
function checkAndReturnKeys(jsonStr) { const requiredKeys = ['Update', 'Rollback', 'Skip', 'Not Now']; try { const obj = JSON.parse(jsonStr); // 检查所有必填键是否都存在 const allExist = requiredKeys.every(key => Object.prototype.hasOwnProperty.call(obj, key)); return allExist ? requiredKeys : []; } catch (e) { // JSON解析失败时返回空数组 return []; } } // 测试示例1 console.log(checkAndReturnKeys('{"Update":"iVBORw0KGgo","Rollback":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}')); // 输出: ["Update", "Rollback", "Skip", "Not Now"] // 测试示例2 console.log(checkAndReturnKeys('{"Update":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}')); // 输出: []
这个方案逻辑清晰,还能处理JSON格式错误的情况,比正则更适配你的场景。
内容的提问来源于stack exchange,提问作者D3W10
相关产品推荐
相关产品推荐

