【问题标题】:Regex to check Illegal Search Pattern正则表达式检查非法搜索模式
【发布时间】:2015-07-10 17:47:57
【问题描述】:

我正在尝试将以下函数转换为简单的正则表达式检查,以在我的搜索应用中查找非法模式。

规则是

  1. 任何不带 * 的字符串:不匹配。
  2. * 本身:不匹配。
  3. 如果 * 存在且字符串长度小于 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


【解决方案1】:

好的,仍然不确定我是否正确,所以请测试并告诉我这是否是您想要的:

/^.*(?:^| or |\|)(?=.?\*)(\**)[^\s\*](\**)(?=$| or |\|).*$/

这是忽略空格的版本:

/^.*(?:^| or |\|)\s*(?=\s*.?\s*\*)\s*(\*\s*)*[^\s\*]\s*(\*\s*)*(?=$| or |\|).*$/

为了便于理解,我先解释一下基本的:

  • ^.*.*$ 包围所有内容 - 如果找到一个匹配项,这将使我们匹配整个字符串。 Aka 如果我们有a*|aa,我们将匹配整个事情,而不仅仅是a*。如果您只想匹配子模式 - 您可以删除它们。
  • (?:^| or |\|)(?=$| or |\|) 包围所有内容——这将使我们一次评估一个子模式。 Aka 将每次尝试与行开始/结束或|or 匹配。
  • (?=.?\*) - 正向前瞻表示“在以下模式中,第一个或第二个字符必须是 *。根据第三条规则,第一个找到的星不应该在第三个或后面的位置,也不应该是根据第一条规则,我们允许没有星星。
  • (\**)[^\s\*](\**) - 匹配任意数量的*,后跟一个字符(不是星号或空格),然后是任意数量的*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多