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

时间:2019-05-29 22:14:46

标签: javascript regex regex-lookarounds regex-group regex-greedy

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

  

颜色:蓝色AND尺寸:“女人的大”(<-多字值或属性名称用引号引起来)

在蓝色后面加上一个空格后,我需要我的正则表达式匹配,如果用户开始键入“ A / AN / AND / O / OR”,则需要它匹配。一旦他们在运算符后面放了一个空格,我就需要它停止匹配。

这是我想出的表达方式。

const contextIsOperator = /[\w\d\s"]+: *[\w\s\d"]+ [\w]*$/

一旦我在“蓝色”之后加一个空格,它就会匹配,但是会匹配我之后的所有内容。如果我用+替换表达式中的最后一个*,则当我在“蓝色” 后放置一个空格并开始手动键入其中一个运算符时可以使用,但如果我只有“蓝色”之后的空格。

我脑海中用文字写成的图案是:

  1. 一组一个或多个字符/数字/空格/引号
  2. 后跟冒号
  3. 后跟一个可选空格
  4. 之后是另一组一个或多个字符/数字/空格/引号
  5. 后跟一个空格(在值之后)
  6. 后跟一个或多个字符(这是运算符)

如何解决此问题?

4 个答案:

答案 0 :(得分:2)

[\w]*更改为与ANDOR或其前缀之一匹配的内容。然后,您可以使用?

将其设置为可选
[\w\s"]+: *[\w\s"]+ (A|AN|AND|O|OR)?$

DEMO

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

答案 1 :(得分:1)

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

const regex = /((("[\w\s"'']+(?="\b))"|[\w"'']+):\s?(("[\w\s"'']+(?="\b))"|[\w"'']+)\s(AND|OR)(?=\b\s))+/

怪兽应该匹配(NOTE: QUOTED KEYS/VALUES MUST BE DOUBLE QUOTED):

Color: Blue AND "Size5":"Women's Large"
"weird KEy":regularvalue OR otherKey: "quoted value"

答案 2 :(得分:1)

您在这里,尝试一下

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

https://regex101.com/r/neUQ0g/1

解释

 ^                             # 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)                    
                (?!)
           )?
      )?
 )?

答案 3 :(得分:0)

是的,您的语言不够确定,无法使用正则表达式正确建模。话虽如此,您可以采用2种方法:

  1. 要求所有值(:之后且运算符之前的值)都用引号引起来
  2. 构建一个简单的状态机,可以更智能地解析数据。 (Google有限状态机解析器)

如果选择使用第一种方法,则可以使用以下正则表达式:

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

我会解释不同的组成部分,但是regex101已经为我提供了非常好的视觉效果和细节。