Как использовать regsub или regex в Tcl для удаления начальных и конечных символов из "начального" периода

Извлечение частей текста из предложения / строки с помощью regex а также regsubфункции - левый и правый. Например строка:

  • номер урока @12.4.1@_01.html

мне нужно regsub и / илиregex оставить только фрагмент между "@".

Оставаясь так: 12.1.4 остальное может стереть все левые и правые излишки.

В другом сценарии, в Bash, а не в Tcl. Я могу это сделать так:

Я задаю этот вопрос, скорее, для обучения. То есть научиться использовать собственные возможности этого языка Tcl вместо того, чтобы полагаться на саму команду Unix-Like.

Как создать регулярное выражение для выполнения этой команды? Заранее спасибо...

2 ответа

Решение

Я предпочитаю думать о выборе текста между@символы. Для этого мы используемregexp(с группой захвата). В этом случае проще всего использовать нежадную внутреннюю деталь.

regexp {@(.*?)@} $var -> wantedBit
puts $wantedBit

Обратите внимание, что -> - это фиктивное имя переменной, которое принимает весь текст совпадения (которое нас не интересует).

Можно сделать код, который больше похож на этот код sed, с помощью regsub:

set var [regsub {^.*@(.*)@.*$} $var {\1}]

Диалект регулярных выражений немного отличается.

Почему требуется использовать регулярное выражение? Эту проблему легко решить без него, используяsplit а также lindex:

set var "learning lesson number@12.4.1@_01.html"
puts [lindex [split $var @] 1]
Другие вопросы по тегам