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

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

  • учебный урок номер@12.4.1@_01.html

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

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

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

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

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

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


person Diego Henrique    schedule 30.12.2019    source источник


Ответы (2)


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

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

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

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

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

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

person Donal Fellows    schedule 30.12.2019
comment
Эти два фрагмента кода делают разные вещи, когда во входном тексте есть как минимум три символа @. - person Donal Fellows; 30.12.2019

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

set var "learning lesson [email protected]@_01.html"
puts [lindex [split $var @] 1]
person Schelte Bron    schedule 30.12.2019
comment
Вы процитировали: Почему требование использовать регулярное выражение? [...] в вашем ответе. Ну я вам отвечаю.. для меня это не приоритет, потому что я даже додумался сделать это более простым способом, только не пробовал! Это правда. Так что это было просто на уме. Поэтому я подумал, что это будет работать только с регулярным выражением, которое соответствует заданным точкам как @ ссылкам. Только я был неправ, и некрасив. Прежде чем я пробовал что-то подобное -; просто, быстро и функционально. Псевдоним гораздо проще украсить и запомнить. - person Diego Henrique; 30.12.2019
comment
Я хочу пояснить вам здесь, что .. Хотя ваш ответ был ясен и легко понятен тем, кто его читал. Мне было довольно трудно принять решение о моем абсолютном голосовании. Но с учетом загруженности тех, кто откликнулся первым. Я использовал в качестве критерия для принятия решения это Голосование. Это два слишком хороших ответа, и они входят в рамки вопроса. Но я должен выбирать между вашим ответом, и поэтому к тому времени, когда ответ был дан, я решил, что это было логическое рассуждение. - person Diego Henrique; 30.12.2019