我试图在drool规则引擎中使用正则表达式来查找sql查询(String)中的特定关键字。但即便是最简单的正则表达也无效。
正则表达式: - (\s|\r)(VALUES)(\|\r)
Drool语法: - when Query :Bean(Value matches "(\s|\r)(VALUES)(\|\r)")
我要做的是,在查询中找到值关键字,其中( \ n 或 \ r 或 \ s 或' )'或' (')可能在其之前或之后出现。
例如insert into table values (xyz);
或insert into table
values (xyz);
或insert into table values
(xyz);
代码正在运行而没有错误但是找不到关键字。 我正在使用 drools 5.3.0 和java jdk 1.8。
我也尝试了(\\s|\\r)(VALUES)(\\|\\r)
for \ in java 。仍然没有运气。
任何指导都将不胜感激。
答案 0 :(得分:1)
您应该记住,matches
需要完整的字符串匹配。因此,要将字符串与整个单词VALUES
匹配,您需要确保匹配单词前后的字符,并且.*
(使用DOTALL修饰符)是通常的选择:
"(?s).*\\bVALUES\\b.*"
<强>详情
(?s)
- 一个DOT-ALL内联修饰符,使.
匹配任何字符.*
- 任意0个字符,尽可能多\\bVALUES\\b
- 整个单词VALUES
(\b
为单词边界).*
- 任意0个字符,尽可能多。要确保VALUES
周围有特定的字符,您可以使用
"(\\s|\\))(VALUES)(\\\\|\r)"
或与字符类相同:
"([\\s)])(VALUES)([\\\\\r])"
请记住,\
应该转义以定义文字\
并匹配反斜杠,您需要使用4个反斜杠。因此,([\\s)])(VALUES)([\\\\\r])
匹配空白或)
,然后VALUES
和\
或此后的CR符号。