Регулярное выражение соответствует, только если подшаблон не совпадает - PullRequest
4 голосов
/ 25 марта 2009

Я пытаюсь сопоставить комментарии в стиле C в форме файла, но только если комментарий не начинается с определенных меток, введенных @

Например, от

/* some comment to match */
/* another comment.
this should match also */
/*@special shouldn't match*/

Возможно ли это только с помощью регулярных выражений?

Я пытаюсь сделать это, используя реализацию регулярных выражений в JavaScript.

Ответы [ 3 ]

4 голосов
/ 25 марта 2009
/\*\s*(?!@)(?:(?!\*/).)*\*/

Разбивается как:

/\*               // "/*"
\s*               // optional space
(?!@)             // not followed by "@"
(?:               // don't capture...
   (?!\*/).       // ...anything that is not "*/"
)*                // but match it as often as possible
\*/               // "*/"

Используется в режимах "global" и "dotall" (например, точка также должна соответствовать новым линиям)

Обычное слово с предупреждением: Как и для всех заданий синтаксического анализа, выполняемых с регулярными выражениями, произойдет сбой для вложенных шаблонов и неправильного ввода.

emk указывает на хороший пример (иначе допустимого) ввода, который вызовет разрыв этого выражения. С этим ничего не поделаешь, регулярное выражение не для анализа. Если вы уверены, что подобные вещи никогда не появятся на вашем входе, регулярное выражение все равно будет работать для вас.

1 голос
/ 25 марта 2009

Вы можете начать с чего-то вроде этого:

/\*[^@]

Но, в общем, вы не смотрите, чтобы сопоставлять комментарии в стиле C с регулярными выражениями из-за неприятных угловых случаев. Рассмотрим:

"foo\" /* " " */ "

В этом коде нет комментариев (это конкатенация двух строковых литералов во время компиляции), но вам не сильно повезет при его разборе без реального парсера. (Технически, вы могли бы использовать регулярное выражение, потому что вам нужен только простой конечный автомат. Но это очень отвратительное регулярное выражение.)

0 голосов
/ 27 марта 2009

использовать отрицательный взгляд

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