Regex Lookahead和Lookbehind来解析SQL语句

时间:2016-09-15 12:59:06

标签: java sql regex

我正在尝试使用正则表达式解析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还是别的什么?

2 个答案:

答案 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的工作原理。