我正在尝试在 drool 规则引擎中使用正则表达式来查找 sql 查询(字符串)中的特定关键字。但即使是最简单的正则表达式也不起作用。
正则表达式:- (\s|\r)(VALUES)(\|\r)
Drool 语法:- 当 Query :Bean(Value matches "(\s|\r)(VALUES)(\|\r)")
我想做的是,在查询中找到 Values 关键字,其中 (\n 或 \r或 \s 或 ')' 或 '(' ) 可能出现在它之前或之后。
例如insert into table values (xyz);
或插入表格
值 (xyz);
或插入表值
(xyz);
代码运行无误,但未找到关键字。 我正在使用 drools 5.3.0 和 java jdk 1.8。
我也为 \in java 尝试了 (\\s|\\r)(VALUES)(\\|\\r)
。仍然没有运气。
任何指导将不胜感激。
最佳答案
您应该记住,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 符号。
关于java - 正则表达式在 drools 5.3.0 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729650/