正则表达式在 drools 5.3.0 中不起作用

Regular expression not working in drools 5.3.0

我正在尝试在 drool 规则引擎中使用正则表达式来查找 sql 查询(字符串)中的特定关键字。但即使是最简单的正则表达式也不起作用。

正则表达式:- (\s|\r)(VALUES)(\|\r)

流口水语法:- when Query :Bean(Value matches "(\s|\r)(VALUES)(\|\r)")

我想做的是,在查询中找到 Values 关键字,其中 (\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。

我也在 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 符号。