Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Regex_Regex Lookarounds_Regex Group_Regex Greedy - Fatal编程技术网

Javascript 用于自动完成功能的正则表达式

Javascript 用于自动完成功能的正则表达式,javascript,regex,regex-lookarounds,regex-group,regex-greedy,Javascript,Regex,Regex Lookarounds,Regex Group,Regex Greedy,我正在编写一个带有自动完成功能的搜索栏,它连接到一个端点。我使用正则表达式来确定我在搜索栏中键入的查询中的“上下文”。这三个上下文是“属性”、“值”和“运算符”。允许的两个运算符是“和”和“或”。下面是一个示例查询 颜色:蓝色和尺码:“女式大号”(将[\w]*更改为与和、或或其前缀之一匹配的颜色。然后,您可以使用? [\w\s"]+: *[\w\s"]+ (A|AN|AND|O|OR)?$ 请注意,Size:Women's Large与此不匹配,因为撇号不在只匹配字母、数字和下划线的\w中。

我正在编写一个带有自动完成功能的搜索栏,它连接到一个端点。我使用正则表达式来确定我在搜索栏中键入的查询中的“上下文”。这三个上下文是“属性”、“值”和“运算符”。允许的两个运算符是“和”和“或”。下面是一个示例查询


颜色:蓝色和尺码:“女式大号”(将
[\w]*
更改为与
或其前缀之一匹配的颜色。然后,您可以使用

[\w\s"]+: *[\w\s"]+ (A|AN|AND|O|OR)?$


请注意,
Size:Women's Large
与此不匹配,因为撇号不在只匹配字母、数字和下划线的
\w
中。您需要将这些字段中允许的任何其他标点字符添加到字符集。

编辑:这是最后一个,请检查单元测试

const regex=/(((“[\w\s””+(?=”\b))“[\w”+):\s:((“[\w\s””+(?=”\b))“[\w”+)\s(和(?=\b\s))+/
该怪物应该匹配(
注意:带引号的键/值必须是双引号的
):


也就是说,您的语言不够确定性,无法用正则表达式正确建模。也就是说,您可以采取两种方法:

  • 要求所有值(在
    之后和运算符之前的内容)都用引号括起来
  • 构建一个简单的状态机,可以更智能地解析数据
  • 如果选择使用第一种方法,则可以使用以下正则表达式:

    ^(("?[\w\s]+"?): ?("[\w\s']+")( (AND|OR) )?)+$
    

    我会解释不同的组件,但已经用非常好的视觉效果和细节为我做了解释。

    给你,试试这个

    ^(?:"[^"]*"|[^\s:]+):[ ](?:"[^"]*"|[^\s:]+)[ ](?:A(?:N(?:D(?:[ ](*SKIP)(?!))?)?)?|O(?:R(?:[ ](*SKIP)(?!))?)?)?
    

    解释

     ^                             # BOS
     (?:                           # Attribute
          "
          [^"]* 
          "
       |  
          [^\s:]+ 
     )
     :
     [ ] 
     (?:                           # Value
          "
          [^"]* 
          "
       |  
          [^\s:]+ 
     )
     [ ]                           # Start matching after Attribute: Value + space
     (?:                           # Operator
          A
          (?:
               N
               (?:
                    D 
                    (?:                           # Stop matching after 'AND '
                         [ ] 
                         (*SKIP) 
                         (?!)
                    )?
               )?
          )?
       |  
          O 
          (?:
               R 
               (?:                           # Stop matching after 'OR '
                    [ ] 
                    (*SKIP)                    
                    (?!)
               )?
          )?
     )?
    

    在问题中使用代码时,请将所有代码放在代码块中:通常,将所有代码行缩进4个空格,或用3个反勾(
    ``
    )环绕代码块。对于与非代码在同一行的内联代码,请在代码的每一侧用一个反勾(
    `
    )环绕代码。使用lexer+解析器可能会更好。但最终会有人帮助您使用正则表达式。不必同时使用
    \w
    \d
    ,因为数字包含在
    \w
    中。当您说“characters”时,我想您的意思是“字母”?“characters”表示任何类型的字符。它不匹配,因为
    女式大号
    中有撇号。这不是字母、数字、空格或引号。即使使用提供的示例(甚至去掉撇号),此解决方案也不起作用.
    $
    表示字符串的结尾,因此您可以指定该和/或位于字符串的结尾。另外,为什么会有将匹配无效运算符(
    AN
    A
    O
    )的
    (A | AN |和| O | OR)
    。这与他提供的示例不匹配:@c1moore我已经修复了它,谢谢!结果是,以前的正则表达式只需要在末尾添加一个额外的空间,但这一个要好得多。哇!这太棒了。谢谢你花时间写出这么复杂的表达式!@SeanSan-一点也不复杂。
    ^(?:"[^"]*"|[^\s:]+):[ ](?:"[^"]*"|[^\s:]+)[ ](?:A(?:N(?:D(?:[ ](*SKIP)(?!))?)?)?|O(?:R(?:[ ](*SKIP)(?!))?)?)?
    
     ^                             # BOS
     (?:                           # Attribute
          "
          [^"]* 
          "
       |  
          [^\s:]+ 
     )
     :
     [ ] 
     (?:                           # Value
          "
          [^"]* 
          "
       |  
          [^\s:]+ 
     )
     [ ]                           # Start matching after Attribute: Value + space
     (?:                           # Operator
          A
          (?:
               N
               (?:
                    D 
                    (?:                           # Stop matching after 'AND '
                         [ ] 
                         (*SKIP) 
                         (?!)
                    )?
               )?
          )?
       |  
          O 
          (?:
               R 
               (?:                           # Stop matching after 'OR '
                    [ ] 
                    (*SKIP)                    
                    (?!)
               )?
          )?
     )?