Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用引号和*_Javascript_Angularjs_Regex - Fatal编程技术网

Javascript 使用引号和*

Javascript 使用引号和*,javascript,angularjs,regex,Javascript,Angularjs,Regex,我试图编写一个正则表达式来验证用户输入的文本。我希望将正则表达式与指令一起使用,因此应避免使用g标志 本质上,有许多“简单”的规则 必须有一个或多个单词 不允许使用单引号(”) 允许使用双引号(“),但必须成对使用,即打开和关闭 成对双引号必须包含一个或多个单词 双引号与其相邻的单词之间不允许有空格 不允许使用星号(*),除非它紧跟在结束双引号之前,紧跟在一个单词之后,且没有空格 这里有一些例子 example match ''

我试图编写一个正则表达式来验证用户输入的文本。我希望将正则表达式与指令一起使用,因此应避免使用
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
    
    我创造了

    我正在努力接近任何地方

    我有一个这样的表情

    /(")(?:(?=(\\?))\2.)*?\1/
    
    这将匹配成对双引号之间的文本

    /^.*\*"$/
    
    将匹配以“*”结尾的文本

    正如你所看到的,我还有很长的路要走,请帮助我

    正则表达式是否可能是执行此操作的错误方法

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

    祝您在生产代码库中使用它好运

    好吧,那么大福


    我们要重用的一个重要思想是如何达到一个位置,在此之前,您知道有偶数个
    s。即:

    [^"]*("[^"]*"[^"]*)*
    
    不幸的是,我们不能在javascript正则表达式中重用模式,因此我们必须在需要的地方重复它。即:


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

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


    双引号与其相邻的单词之间不允许有空格

    我们将其分为两部分-不会发生在左侧,也不会发生在右侧:

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

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

    (没有仅换行空格的成对引号)


    其余的更容易:

    必须有一个或多个单词

    (在某些点上有一个单词边界(
    \b


    不允许使用单引号(')

    (或根据注释中的解释,除环绕字符串的注释外,不允许使用)


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

    我们将其分为三个部分:

    (1) 必须在
    之前“

    (2) 必须跟在非
    或空格后面

    (?!.*[ "]\*)
    
    (3) 它不在非关闭前


    简洁明了的功能:

    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;
    
    }
    
    函数myParser(字符串){
    var string=string.trim(),
    wordsArray=string.split(“”),
    regExp=/((?=”)^[“][a-zA-Z]+[*]{0,1}[“]$| ^[a-zA-Z]+$)/,
    len=wordsArray.length,
    i=0;
    //"富吧"情况
    if(string.match(/^[“][a-zA-Z]+[\s]?[a-zA-Z]+[*]{0,1}[“]$/){
    返回true;
    }
    对于(i;i
    检查结果

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


    (您的想法:检查2个变体(清除regExp和函数)-在10.000测试情况下-什么工作更快(并且不会失败:))?)

    5和6不是一回事。@ndn,我想差不多,但我不想让
    *
    单独成为一个词。快到了!@Martin,这么近,我已经给了他一笔赏金了。这还不能满足他所举的一半例子gives@Martin,真的吗?哪一个?在左边,进入单元测试,点击►. 过了9点/18@Martin,您已经在测试中包含了单引号。我可以确认@Martin的分析,但它比我开始时的分析要好得多。虽然我倾向于同意,这可能更容易通过函数和正则表达式组合来完成-这个问题特别需要正则表达式解决方案
    ^(?=.*\b)
    
    ^'[^']*'$
    
    (?!.*\*[^"])
    
    (?!.*[ "]\*)
    
    (?!__even_quotes_pattern__[^"]*\*")
    
    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;
    
    }