Regex: как остановить совпадение на определенных словах, которые не могут существовать - PullRequest
1 голос
/ 14 декабря 2010

Заголовок настолько запутанный, я признаю это - если вы хотите изменить его, пожалуйста.

Я работаю над PHP и функцией preg_match.

Проблема в этой строке (просто пример)

ON DELETE SET NULL ON UPDATE CASCADE

ON DELETE CASCADE ON UPDATE CASCADE (еще один пример ..)

Мне нужно найти значения ON DELETE и ON UPDATE, но их обоих там быть не может.

Так что иногда у меня есть это:

ON DELETE something

и другие времена:

ON UPDATE something

и другие времена оба.

Итак, это регулярное выражение не охватывает все возможности:

/ON DELETE (.+) ON UPDATE (.+)/

Если я поставлю

/ON DELETE (.+)( ON UPDATE (.*))?/ - для покрытия дела, в котором нет ОБНОВЛЕНИЯ

, если присутствует ON UPDATE, первая группа выдает «SET NULL ON UPDATE CASCADE».

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

Используйте lookaround, если вы хотите избежать слишком большого соответствия:

Отрицательный взгляд:

/ON DELETE ((?:(?! ON UPDATE).)+)( ON UPDATE (.*))?/

Для захвата без учета заказа:

/(?:ON DELETE ((?:(?! ON UPDATE).)+)|ON UPDATE ((?:(?! ON DELETE).)+))/

Но что именно вы хотите? Удалить оба, если они существуют?

0 голосов
/ 14 декабря 2010

код psuedo, соответствующий совпадению при удалении и обновлении, но не оба

function valid(str)
{
 matchDelete=regex(str, 'ON DELETE'); //true for match
 matchUpdate=regex(str, 'ON UPDATE'); //true for match

 if(   (matchDelete || matchUpdate ) && !(matchDelete && matchUpdate)  )
 {
   valid match
 }
}
0 голосов
/ 14 декабря 2010

используйте Rubular , чтобы проверить свое регулярное выражение

...