Сопоставление слюни с отрицательным просмотром вперед

Я хочу, чтобы одним из моих условий было то, что заявленная строка не входит в список строк.

Я использую таблицу решений, и в ячейке состояния у меня есть

firstName matches("?!($param)")

и в ячейке param у меня есть

Billy|Joe|Bob

По какой-то причине, когда у меня есть такое имя, как Салли, оно не соответствует этому правилу. Если я удалю «Билли | Джо | Боб» из ячейки параметров, он соответствует.

Я должен, вероятно, упомянуть, что я использую слюни 3.0.6. Я видел упоминание о совпадениях not, которые были добавлены в слюни 4, но по причинам, в которые я не буду вдаваться, я не могу обновить.


person AmishDave    schedule 24.08.2012    source источник


Ответы (3)


Негативный взгляд в будущее - это нечто совершенно иное, чем отрицание выражения, которое, я думаю, именно то, что вы ищете.

Я не очень хорошо помню Drools 3, но вам, вероятно, придется использовать выражение eval, чтобы это опровергнуть. Итак, ваша ячейка таблицы решений будет выглядеть так

eval( ! getFirstName().matches("($param)") )

В основном вы вызываете чистое выражение java вместо использования предоставленного оператора совпадений.

person Edson Tirelli    schedule 25.08.2012
comment
Я не думаю, что eval разрешен в таблицах решений в слюнях 3. Он говорит о неожиданном токене на eval. - person AmishDave; 28.08.2012
comment
Таблицы решений - это просто текстовые шаблоны для генерации правил, поэтому они принимают оценки, просто вопрос поиска правильного синтаксиса. Взгляните на сгенерированное правило и посмотрите, что не так ... это может помочь вам исправить. - person Edson Tirelli; 28.08.2012

У вас ведущая скоба неуместна.

Синтаксис отрицательного прогноза:

(?!$param)

Однако одного этого изменения недостаточно. Вам нужно привязать регулярное выражение:

^(?!.*$param)

Это регулярное выражение говорит: «сопоставить любой ввод, который не содержит $param».

Итак, используя ваш пример, ^(?!.*Billy|Joe|Bob) будет соответствовать любому входу, который не содержит Bill, Joe или Bob

person Bohemian♦    schedule 25.08.2012
comment
Я попробовал и то, и другое, и они не сработали. Я считаю, что ваше регулярное выражение правильное, но у меня есть подозрение, что слюни 3.0 не поддерживает полную грамматику регулярных выражений. - person AmishDave; 28.08.2012

Лучшее решение, которое я нашел, - разбить это на несколько условий. Хотел бы я поместить все это в одно состояние, но для этого я уверен, что мне нужно подняться как минимум до 4 слюней.

| firstName!="$param" | firstName!="$param" | firstName!="$param" |
|Billy                |Joe                  |Bob                  |

Примечание. Использование каналов в исходном вопросе должно было рассматриваться как «или», тогда как здесь я использую каналы для обозначения ячеек в таблице.

person AmishDave    schedule 27.08.2012