Регулярное выражение для сопоставления строки с другим словом - PullRequest
1 голос
/ 26 мая 2011

Поэтому я пытаюсь написать регулярное выражение, которое будет соответствовать определенной строке, а затем, в конечном итоге, другому слову.Например, в строке SELECT * FROM persons ORDER BY name ASC LIMIT 10 я бы хотел сопоставить ORDER BY name ASC LIMIT.Кажется, это должно быть просто, но я не смог понять это.

По сути, мне все равно, что между ORDER BY и LIMIT, но я бы хотел прекратить сопоставлять в LIMIT,Вот что у меня есть:

string pattern = @"\s*ORDER\s*BY.*LIMIT";

Но в конечном итоге оно совпадает со всем оператором SELECT, и я хочу остановиться на LIMIT.

Заранее спасибо!

1 Ответ

5 голосов
/ 26 мая 2011

Попробуйте вместо этого использовать этот измененный шаблон:

string pattern = @"\s*ORDER\s*BY.+?LIMIT";

Использование .* является вероятным виновником, так как это жадное совпадение.Чтобы сделать его нежадным, добавьте к нему ?, сделав его .*?.Лично я предпочитаю использовать .+?, если я ожидаю, что хотя бы один символ будет сопоставлен впоследствии.Для \s* вы не захотите делать его нежадным, но, возможно, ожидаете использовать \s+, чтобы гарантировать наличие хотя бы одного символа пробела.На самом деле, вы бы хотели использовать \b для сопоставления границы слова, а не думать в терминах пробела, что изменило бы шаблон на такой:

string pattern = @"\bORDER\s+BY\b.+?\bLIMIT\b";

Другими словами, сопоставьте началослова «ORDER», за которым следует хотя бы один пробельный символ, совпадение «BY» и граница слова (конец слова), а затем сопоставление с любым символом хотя бы один раз, не жадный, пока полное слово «LIMIT» не станетнайденный.Знание ваших данных важно, и вы, вероятно, можете избежать неприятностей с первым шаблоном.Границы слов полезны, чтобы избежать частичных совпадений и обеспечить полное совпадение слов.Например, см. этот связанный вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...