我正在尝试使用正则表达式解析SQL语句并保存它的参数以供以后使用。
让我说我有这个SQL语句:
INSERT INTO tablename (id, name, email) VALUES (@id, @name, @email)
以下正则表达式可以正常工作:
(@[0-9a-zA-Z$_]+)
但是在这个陈述中,我应该忽略''或'“中的所有内容并仅保存第一个参数:
UPDATE mytable SET id = @id, name = 'myname@id' WHERE id = 1;
根据这个答案https://stackoverflow.com/a/307957“在一个正则表达式中这样做是不切实际的”,但我仍然试图这样做。
我尝试添加Regex Lookahead和Lookbehind,但它不起作用:
(?<!\').*(@[0-9a-zA-Z$_]+).*(?!\')
有没有办法只使用一个正则表达式?我应该使用lookahead / lookbehind还是别的什么?
答案 0 :(得分:1)
您可以使用:[\=\(\s]\s*\@[0-9+^a-zA-Z_0-9$_]+\s*[\),]
<强>解释强>:
[\=\(\s]
匹配下面列表中的单个字符
\=
匹配字符=字面\(
匹配字符(字面意思\s
匹配任何空格字符[\r\n\t\f ]
\s*
匹配任何空格字符[\r\n\t\f ]
量词:*
在零和无限次之间,尽可能多次,根据需要回馈[贪婪]
\@
字面匹配字符@
[0-9+^a-zA-Z_0-9$_]+
匹配下面列表中的单个字符
量词:+
在一次和无限次之间,尽可能多次,根据需要回馈[贪婪]
0-9
0到9之间范围内的单个字符+^
列表+^
中的单个字符a-z
a和z之间范围内的单个字符(不区分大小写)A-Z
A和Z之间范围内的单个字符(不区分大小写)_
文字_
0-9
0到9之间范围内的单个字符$_
列表$_
中的单个字符 \s*
匹配任何空格字符[\r\n\t\f ]
*
在零和无限次之间,尽可能多次,根据需要回馈[贪婪] [\),]
匹配下面列表中的单个字符
\)
字面匹配字符)
,
文字,
答案 1 :(得分:0)
您可以简化正则表达式。请注意,您希望始终捕获的群组后跟,
或)
。意识到这个事实,你得到这个正则表达式:
(@[0-9a-zA-Z$_]+)(?=[,)])
@[0-9a-zA-Z$_]+
是您的价值(?=[,)])
会检查后跟)
或,
字符。如果描述无法放置字符串的位置的方式很复杂,那么请更好地查看它必须放置的位置。
了解Regex101的工作原理。