【发布时间】:2015-07-10 17:47:57
【问题描述】:
我正在尝试将以下函数转换为简单的正则表达式检查,以在我的搜索应用中查找非法模式。
规则是
- 任何不带 * 的字符串:不匹配。
- * 本身:不匹配。
- 如果 * 存在且字符串长度小于 3(忽略空格):匹配
这就是它的棘手之处,|和 (space)or(space) 在我的应用程序中导致运行两个不同的搜索,因此它必须分别评估每一侧的字符串。就像下面的函数一样。该功能有效,但 regexCheck 无效。
var regexCheck = /^[A-Za-z0-9]*$/g;
var check = function (s) {
var flag = true;
var b = s.replace(/ or /g,'|').split('|');
for (var i = 0; i < b.length; i++) {
if (flag && b[i].indexOf('*') > - 1) {
var startCount = (b[i].match(/[*]/g) || []).length;
var limit = (startCount > 0) ? 2 : 3;
var c = b[i].replace(/[ *]/g, '');
if (c.length < limit && c.length > 0) {
flag = false;
break;
}
}
}
if (flag) {
console.log('good:' + s);
} else {
console.log('fail:' + s);
}
return flag;
};
var s = [
'a',
'*',
'a*',
'*a',
'a*a',
'a*a|aa',
'a*a|a',
'a*a|a*',
'a*a or a*',
];
var j = 0;
while (j < s.length) {
check(s[j]);
if(regexCheck.test(s[j])){
console.log('rg-good:' + s[j]);
} else {
console.log('rg-fail:' + s[j]);
}
j++;
}
【问题讨论】:
-
对不起,我懒得看你的代码,你的解释也不是很清楚。如果我理解正确,在你得到一个字符串并忽略所有空格之后:一个匹配是两个字符,其中一个是星号,另一个不是,或者两个正确,匹配由
|或`或`分隔? -
是的,我知道,我很抱歉!这对我来说也很困惑。是的,你没看错,只是星星只计算一次。所以像 *a* 这样的东西仍然是非法的,必须匹配。
-
最终澄清 - 是否匹配:
x*|xx -
是的,简单地说,它必须分别评估
|的每一侧,所以匹配的是x*
标签: javascript regex pattern-matching