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