首页 文章

使用引号和*验证搜索表达式

提问于
浏览
4

我希望将正则表达式与ngPattern指令一起使用,因此应避免使用 g 标志 .

从本质上讲,有许多“简单”规则 .

  • 必须有一个或多个单词 .

  • 不允许使用单引号( ' ) .

  • 允许双引号( " )但必须配对,即打开和关闭 .

  • 成对的双引号必须包含一个或多个单词 .

  • 双引号与它相邻包装的单词之间不允许有空格 .

  • 不允许使用星号( * ),除非它紧跟在结束双引号之前并且跟在单词后面,没有空格 .

这里有些例子 .

example                        match

''                             false
'  '                           false
'  foo'                        true
'foo'                          true
'foo bar'                      true
'foo bar*'                     false
'"foo'                         false
'"foo"'                        true
'" foo"'                       false
'"foo "'                       false
'"foo bar"'                    true
'"foo *"'                      false
'"foo*"'                       true
'foo*"'                        false
'"foo*" "bar*"'                true
'foo "bar*"'                   true
'"foo* bar"'                   false
'"foo*" bar'                   true

我创建了unit tests here

我很难靠近,

我有这样的表达方式

/(")(?:(?=(\\?))\2.)*?\1/

这将匹配成对的双引号之间的文本 . 像这样的东西,

/^.*\*"$/

将匹配以 '*"' 结尾的文本,

你可以看到,我还有很长的路要走,请帮忙 .

正则表达式是否可能是错误的方法?

2 回答

  • 3
    ^(?=.*\b)(?=[^"]*("[^"]*"[^"]*)*$)(?![^"]*("[^"]*"[^"]*)*" *")(?!.*\*[^"])(?!.*[ "]\*)(?![^"]*("[^"]*"[^"]*)*[^"]*\*")(?![^"]*("[^"]*"[^"]*)*" \w)(?![^"]*("[^"]*"[^"]*)*"[^"]*\w ")'[^']*'$
    

    See it in action

    Good luck using this in your production codebase

    好的,所以dafuq ......


    我们要重用的一个重要想法是如何到达一个位置,在此之前你知道有一个偶数个 " . 即:

    [^"]*("[^"]*"[^"]*)*
    

    不幸的是,我们无法在javascript正则表达式中重用模式,因此我们必须在需要的地方重复它 . 即:


    允许使用双引号(“)但必须配对,即打开和关闭 .

    ^(?=__even_quotes_pattern__$)
    

    基本上,我们从一开始就说( ^ ),当我们迭代直到结束( $ )时,我们匹配所述模式,即偶数 " .


    双引号和它相邻包含的单词之间不允许有空格 .

    我们将分为两部分 - 左边不会发生,右边不会发生:

    ^(?!__even_quotes_pattern__" \w)
    ^(?!__even_quotes_pattern__\w ")
    

    配对双引号必须包含一个或多个单词 .

    ^(?!__even_quotes_pattern__" *")
    

    (没有包含空格的配对引号)


    其余的更容易:

    必须有一个或多个单词 .

    ^(?=.*\b)
    

    (在某些时候有一个单词边界( \b ))


    不允许使用单引号(') .

    (或者从评论中的解释来看,除了包装字符串之外不允许)

    ^'[^']*'$
    

    不允许使用星号(*),除非它紧跟在结束双引号之前并且跟在单词后面,没有空格 .

    我们将其分为三个部分:

    (1)必须先于 "

    (?!.*\*[^"])
    

    (2)必须遵循非 " 或空格

    (?!.*[ "]\*)
    

    (3)它不在非关闭之前 "

    (?!__even_quotes_pattern__[^"]*\*")
    
  • -1

    干净简单的功能:

    function myParser(string) {
    
        var string = string.trim(),
            wordsArray = string.split(' '),
            regExp = /((?=")^["][a-zA-Z]+[*]{0,1}["]$|^[a-zA-Z]+$)/,
            len = wordsArray.length,
            i = 0;
    
        // '"foo bar"' situation
        if (string.match(/^["][a-zA-Z]+[\s]?[a-zA-Z]+[*]{0,1}["]$/)) {
            return true;    
        }
    
        for (i; i < len; i++) {
            var result = wordsArray[i].match(regExp);
            if (result === null) {
                return false;
            }
        }
    
        return true;
    
    }
    

    https://jsfiddle.net/cy9ozmdm/检查结果 .

    如果你需要解释 - 写评论,我会写详细的逻辑 .

    (想法为你:检查2个变种(清除regExp和功能) - 在10.000测试情况 - 什么工作得更快(并且不会失败:))?)

相关问题