2012-06-26 3 views
0

Относительно регулярное выражение TCL, если я использую следующее регулярное выражение:Backslash в Tcl регулярных выражениях

regexp "helloworld\[\\s]+.name." 

, чтобы соответствовать следующему выводу:

helloworld (name) 

это работает. но мне интересно, нужно ли добавить «\» перед «]», я увидел код, сделанный другими, они не закрыли «]» с «\», я хочу знать, почему.

ответ

1

Одна из причин может быть то, что Utkanos объяснил, другой может быть связано с Tcl-специфического поведения: [ характер имеет особое значение в тех местах, где команда замена допускается. Обратите внимание:

% proc foo {} { return y } 
% puts x[foo]z 
xyz 

Следовательно, когда вы работаете с регулярным выражением в Tcl (либо пытаясь определить его буквально, или построить в во время выполнения и т.д.), вы должны думать, как строка, которая формирует это регулярное выражение будет обрабатываться Tcl.

Именно поэтому большая часть времени вы видите символы регулярных выражений передаются непосредственно в команду regexp сгруппирован с помощью фигурных скобок, { и }: он ингибирует (в большинстве случаев) замены TCL и, следовательно, позволяет писать спецификации регулярных выражений " как есть ", почти в своем простом синтаксисе, без каких-либо побегов.

Но это, очевидно, не очень хорошо подходит для случаев, когда вы хотите динамически строить спецификацию (скажем, вставлять содержимое переменной там). Обычно люди прибегают к группировке символов регулярного выражения, используя двойные кавычки, поэтому необходимо выполнить специальное экранирование, чтобы предотвратить определенные замены Tcl. Более чистый подход может заключаться в том, чтобы построить шаблон, используя команду append.

Дополнительная информация о группе here, here и here.

Что касается поиска книги в Интернете, то "Mastering Regular Expressions" - это то, что обычно считается книгой на эту тему.

В качестве примечания, в вашем конкретном примере квадратных скобки не нужны вовсе: в регулярных выражениях, они используются для создания «символы в диапазон» — шаблонов, соответствующих одиночные символы из указанного диапазона, — и ваш случай состоит из точно одного (мета) символа, определенного в соответствии с одним символом пробела во входе. Таким образом, в этом конкретном случае шаблон helloworld\s+.name. будет делать все отлично.

+1

Чтобы прояснить последний момент, сопоставление должно быть написано 'regexp {helloworld \ s + .name.} $ SomeString', с (в основном) простым регулярным выражением в' { 'brace'} 'символов. –

+0

И для дальнейших разъяснений для OP, почему ']' не экранируется: он не имеет особого значения для синтаксического анализатора, поскольку в то время, когда парсер видит эту закрывающую скобку, когда он анализирует строку, сгруппированную двойными кавычками, она еще не увидела никаких открытых '[' и поэтому нет никакой вложенной группы для завершения и обработки. Вы все еще можете избежать этого ']', если вы считаете, что это более читаемо - это не смутит парсер. – kostix

0

Нет, поскольку вы используете [ со специальным значением, то есть для определения диапазона. Вы могли бы избежать этого с помощью обратной косой черты только в том случае, если вы хотите совместить литерал [. Обратные косые черты используются для удаления символов, которые в противном случае вызывают специальное поведение в REGEXP.

(Javascript)

var str = "[hello]"; 
str.match(/[a-z]+/); //resultant array: ['hello'] 
str.match(/\[[a-z]+\]/); //resultant array: ['[hello]'] 
+0

Увы, это вопрос Tcl, а не вопрос Javascript. Это имеет значение, потому что ответ связан с тем, как Tcl обрабатывает метасимволы. –

+0

Отклонение в сторону, так как во многих ответах REGEX можно ответить со ссылкой на общую грамматику REGEX, а не на конкретную среду, в которой работает пользователь, я думал, что попытаюсь помочь. – Utkanos

+0

Я не снисходителен. Вопроситель спрашивает о цитировании, и это узнаваемо проблема, связанная с тегом _other_ в вопросе. (Эй, вы еще не проголосовали ...) –

0

Я считаю, что это выражение является то, что вы хотите:

regexp {helloworld\s+.name.} $the_string 

Вам не нужны никакие квадратные скобки вообще.

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