Одна из причин может быть то, что 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.
будет делать все отлично.
Чтобы прояснить последний момент, сопоставление должно быть написано 'regexp {helloworld \ s + .name.} $ SomeString', с (в основном) простым регулярным выражением в' { 'brace'} 'символов. –
И для дальнейших разъяснений для OP, почему ']' не экранируется: он не имеет особого значения для синтаксического анализатора, поскольку в то время, когда парсер видит эту закрывающую скобку, когда он анализирует строку, сгруппированную двойными кавычками, она еще не увидела никаких открытых '[' и поэтому нет никакой вложенной группы для завершения и обработки. Вы все еще можете избежать этого ']', если вы считаете, что это более читаемо - это не смутит парсер. – kostix