2016-10-18 4 views
0

У меня есть код нижеTCL: . не работает, как ожидалось

set src "/tmp/16.10c.00.01/run.c" 
regsub "\.c" $src ".o" obj 
puts "$obj" 

Она печати /tmp/16.1.o.00.01/run.c как выход. , где в ожидаемом выходе /tmp/16.10c.00.01/run.o. Если я сохраню его как "\.c$", он работает должным образом. Что не так в первом коде.

ответ

3

Что плохого в том, что сырье регулярное выражение передается на переводчика являются:

.c 

выше в регулярном выражении означает любой символ, а затем c.

Что вам нужно сделать, это использовать двойные обратные косые черты, чтобы избежать второй обратной косой черты. То, что или использовать фигурные скобки для цитаты (которые предотвращают первую замену):

regsub "\\.c" $src ".o" obj 
# or 
regsub {\.c} $src ".o" obj 
+0

как является «.c» отличается от „\ .c“ – Rupesh

+0

@Rupesh В регулярном выражении '.' соответствует любому одному символу (это подстановочные). Если вы хотите совместить точку, вам нужно избежать '.', потому что иначе она будет действовать как шаблон. – Jerry

+0

Я понял, что вы пытаетесь сказать. Моя точка зрения заключается только в двойных кавычках. В двойных кавычках, чтобы избежать точки, мы должны положить «\». и, чтобы убежать, мы должны переписать его как «\\.». Я понимаю, что регулярное выражение «.c» и «\ .c» одинаково с точки зрения функциональности. Хотя они разные. Я прав? – Rupesh

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