2013-12-04 3 views
1

У меня есть следующее регулярное выражение: (?iu)[(?=\s)]\bgo\b(?!\S)Найти разделитель и игнорировать ограничитель внутри цитаты

Он работает, чтобы разделить по ограничителю go, в основном это улавливает весь мир и игнорирует специальные символы, такие как #go или --go поэтому он не считается эти разделители.

Что мне нужно теперь его игнорировать разделители внутри комментариев, как: select 'something go something' from table1 go --

Он должен найти только один разделитель и вернуть select 'something go something' from table 1 и --. Любая помощь будет оценена, спасибо.

- ... обновление вопрос выше:

@randomducks, спасибо за совет, насколько есть я мог проверить решение отлично работает.

Прямо сейчас у меня есть следующий шаблон:

(?=(([^']+'){2})*[^']*$)(?iu)[(?=\s)]\bgo\b(?!\S)|^go|go$

(?=(([^']+'){2})*[^']*$): Ignore разделитель внутри цитируемый текст

(?iu)[(?=\s)]\bgo\b(?!\S): поймать разделителем "идти"

|^go|go$: также поймать начало и конец разделителя строк/строк.

Знать все, что мне нужно, это игнорировать разделитель внутри комментариев, например/* go * /. Я попытался адаптировать шаблон выше, чтобы сделать это, но пока не повезло.

+0

Какова цель этого? Какую проблему ты пытаешься решить? – forgivenson

+0

Код фильтра T-SQL. И я уже это делаю. Но у меня все еще есть проблема с разделителями внутри кавычек. Я хочу игнорировать их. PS: шаблон можно протестировать с помощью метода split() из String. – HAT

+0

Я чувствую, что регулярное выражение не является хорошим вариантом для игнорирования текста в кавычках. Если вы не ограничены использованием регулярного выражения, ответ на этот вопрос стоит посмотреть. http://stackoverflow.com/questions/4917932/regex-to-ignore-text-between-quotes – forgivenson

ответ

1

Если вы застряли Нарезка строку, используя регулярное выражение, один из возможных решений может быть использование регулярных выражений для проверки четного числа цитат, как упомянуто @anubhava здесь: https://stackoverflow.com/a/10864960/2788862

Для вашего вопроса, решение будет

(?=(([^']+'){2})*[^']*$)(?iu)[(?=\s)]\bgo\b(?!\S) 

You can see a working example of this here

Update:

Если они не нужны, вы МИГ ht хочет рассмотреть возможность удаления многострочных комментариев, а затем использовать регулярное выражение для выделения операторов SQL. Дополнительную информацию можно найти здесь: http://ostermiller.org/findcomment.html

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

+0

@HAT, я изучаю, как вы можете игнорировать разделители внутри комментариев.Тем временем модераторы, вероятно, захотят, чтобы какие-либо дополнительные вопросы были добавлены в качестве комментариев или как изменения в исходном вопросе, так что, пожалуйста, переместите свой второй вопрос до конца исходного вопроса? Спасибо :-) –

+0

@HAT, сделайте комментарии внутри/* и */необходимо включить или было бы хорошо, если бы они были удалены? –

+0

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

Смежные вопросы