求一个正则表达式

获取用户输入框的数据,是不是符合如下格式:
key = value AND key1 = value1 or key2 = value2
其中key 是字段名 value是字段值,一个key = value就是一个条件,多个条件的话用AND和OR 拼接,注意是大写的AND和OR,value值是带单引号的,。如:gxid = 'sf23434-d%^$#@^'
补充:
1.输入框中获取的字符串可以为空
2.获取的字符串不为空的话开头必须是key = ‘value’格式等于号两边是必须有空格的值是在单引号里面,这个值可以是任何字符串,数字字母汉字标点特殊符号等
3.如果有多个条件的话,
用大写的AND或OR拼接,如:as = ‘mm’ AND bb = ‘nn’不能是as = ‘mm’ AND也不能是as = ‘mm’ OR
4.目的是判断sql查寻语法正确不正确

下面是一个正则表达式,可以用来匹配满足上述要求的字符串:

^(?:(?<key1>\w+)\s*=\s*'(?<value1>[^']*)'\s+(?:(?:AND|OR)\s+(?<key2>\w+)\s*=\s*'(?<value2>[^']*)')*)?$

该正则表达式分为四个部分:

1、以^开头和以$结尾,表示匹配的字符串必须是完整的字符串,不能包含其他字符。

2、中间的部分是一个可选的分组,表示可以匹配空字符串。如果要匹配非空字符串,则必须满足如下条件:

    必须以key1 = 'value1'的格式开头,其中key1是字段名,value1是字段值,两边有空格,值在单引号内。

    可以包含多个条件,用大写的AND或OR拼接,且条件之间必须有空格。每个条件的格式为key2 = 'value2',其中key2是字段名,value2是字段值,两边有空格,值在单引号内。

3、在分组中,使用了命名分组,分别为key1、value1、key2、value2。这样可以方便地获取匹配的字段名和字段值。

4、在匹配字段值时,使用了负向预测先行断话(negative lookahead)来防止匹配到值中的单引号。负向预测先行断言的写法为(?!...),表示后面的模式不能匹配到,才能继续匹配。在这里,我们使用了[^']*来匹配任意多个不是单引号的字符,后面跟着一个负向预测先行断言(?!'),表示匹配的字符串后面不能是单引号。这样就可以防止匹配到值中的单引号。

例如,使用这个正则表达式匹配字符串key1 = 'value1' AND key2 = 'value2'可以得到如下结果:

    key1分组匹配到key1

    value1分组匹配到value1

    key2分组匹配到key2

    value2分组匹配到value2

此外,你还可以使用该正则表达式匹配空字符串,例如:

    匹配字符串'',所有命名分组均不匹配

    匹配字符串key1 = 'value1',key1分组匹配到key1,value1分组匹配到value1,其他命名分组均不匹配

    希望这个正则表达式能帮助你解决问题。

追问

key和value都是变量,不是固定的,可以是:sfsfd = 'dfg34' 也可以是: MHGF = ‘第三方24省道’

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-12-26
^(\s*(key\s*=\s*'[^']*'))(\s+(AND|OR)\s+(key\s*=\s*'[^']*'))*$
如果对你有帮助可以支持答主点个赞,谢谢追问

key和value都是变量,不是固定的,可以是:sfsfd = 'dfg34' 也可以是: MHGF = ‘第三方24省道’

第2个回答  2022-12-26

你可以使用正则表达式来匹配输入框中获取的字符串,以判断它是否符合上述格式。

下面是一个示例正则表达式:

^(?:(?P<key1>\w+) = ' (?P<value1>.*?) ' (?:(?:AND|OR) (?P<key2>\w+) = ' (?P<value2>.*?) ')*)$

这个正则表达式的意思是:

    以键值对的形式匹配多个条件,例如:key1 = 'value1' AND key2 = 'value2'

    每个键值对中,键为一个单词(\w+),值为任意字符串(.*?),值的两端必须有单引号(')包围

    如果有多个条件,则使用大写的AND或OR((?:AND|OR))连接

    要使用这个正则表达式,你需要使用 Python 的 re 模块,或者其他编程语言的正则表达式库。

    例如,你可以这样使用正则表达式来匹配输入框中的字符串:

import re

pattern = r"^(?:(?P<key1>\w+) = ' (?P<value1>.*?) ' (?:(?:AND|OR) (?P<key2>\w+) = ' (?P<value2>.*?) ')*)$"
input_string = "key1 = 'value1' AND key2 = 'value2'"

match = re.match(pattern, input_string)
if match:
# 输入框中的字符串符合格式
# 可以使用 match.group() 获取匹配的整个字符串
# 使用 match.groupdict() 获取各个键值对的字典


相似回答