Использование escape-символов внутри grep - PullRequest
9 голосов
/ 25 марта 2009

У меня есть следующее регулярное выражение для удаления пробелов, табуляции и новых строк: [^ \n\t]

Однако я хочу расширить это для некоторых дополнительных символов, таких как > и <.

Я пытался [^ \n\t<>], который сейчас работает хорошо, но я хочу, чтобы выражение не совпадало, если перед < или > стоит \.

Я пытался [^ \n\t[^\\]<[^\\]>], но это не сработало.

Ответы [ 3 ]

4 голосов
/ 25 марта 2009

Может ли какая-либо из приведенных ниже последовательностей присутствовать в вашем вводе?

\\>
\\\>
\\\\>
\blank
\tab
\newline
...

Если так, как вы предлагаете относиться к ним?

Если нет, то проверочные утверждения нулевой ширины выполнят свою задачу при условии, что ваш движок регулярных выражений поддерживает это. Это будет иметь место в любом движке, который поддерживает регулярные выражения в стиле Perl (включая Perl, PHP и т. Д.):

 (?<!\\)[ \n\t<>]

Вышеуказанное будет соответствовать любому незапертому пробелу, символу новой строки, символу табуляции или угловым скобкам. В более общем смысле (используя \s для обозначения любых пробелов, включая \r):

 (?<!\\)\s

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

 (?:[^ \n\t<>]|\\[<>])

Вы также можете использовать вариацию последнего для обработки случаев \\>, \\\>, \\\\> и т. Д., А также до некоторого конечного числа предыдущих обратных слеш, таких как:

 (?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
0 голосов
/ 25 марта 2009

Согласно справочной странице grep :

Выражение в скобках - это список символы, заключенные в [и]. Это соответствует любому отдельному символу в этом список; если первый символ список - это символ ^, тогда он совпадает любой символ, которого нет в списке.

Это означает, что вы не можете сопоставить последовательность символов, например \ <или \>, только отдельные символы.

Если у вас нет версии grep, созданной с поддержкой регулярных выражений Perl, вы можете использовать обходные пути, как один из других упомянутых постеров. Однако не все версии grep имеют такую ​​поддержку.

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

Может быть, вы можете использовать egrep и поместить строку шаблона в кавычки. Это должно устранить необходимость в побеге.

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