我想提出一个正则表达式来从DML查询语句中提取值,例如仅针对特定列的插入,更新等。
示例DML -
insert into abc_emp.employee (emp_name, emp_id, emp_dept)
values ('Scott Tiger', 2246, 'Accounts')
update abc_dept.department set dept_name = 'Sales', dept_head = 'Scott
Tiger' where dept_id = 10
update abc_cust.dbo.customer set cust_name = 'Adam Jackson'
where cust_id = 1100
在上面的查询中,我的用例中感兴趣的列是 emp_name,emp_id来自员工表, 来自department表的dept_head和来自customer表的cust_name
我想出的正则表达式是 -
(?:insert into|update)(?:\s\w+[\.]((dbo\.)?)(employee|department|customer))
(?:\s([\(]|(set\s)))(?=.*?(emp_name|emp_id|dept_head|cust_name))
这给出了以下结果 - given regex
虽然仍然不完整,但我期待这个正则表达式有4个匹配而不是3个匹配。它不匹配 emp_id 。我怀疑这是由于|第六个捕获组的操作员 -
(emp_name|emp_id|dept_head|cust_name)
在任何查询的第一次匹配时返回。我希望从捕获组中获得尽可能多的匹配(1个或更多),而不仅仅是一个。 有什么办法可以实现吗?
PS:我最后的要求是提取放入这些列的值并对它们进行替换以屏蔽数据。这个正则表达式将是Splunk sed脚本的一部分,其中将发生替换。
正则表达式的味道 - 我认为Splunk使用PCRE,所以Perl。
PPS:我对正则表达式来说很新鲜。编辑1:决定按照@CAustin
的建议单独进行更新和插入查询(?:更新\ S \ W +?(雇员|部门|客户)\ S +((SET \ S +))?)(= EMP_NAME?)|(?= EMP_ID)|(?= dept_head,然后)| (?= CUST_NAME)|(?= cust_phone)