Как удалить одну букву / цифру - PullRequest
0 голосов
/ 28 мая 2019

У меня есть отдельные буквы и цифры в переменной, которые я хотел бы удалить

пример ввода:

USA-2019-1-aoiwer
USA-A-jowerasf
BB-a_owierlasdf-2019
flsfwer_5_2015-asfdlwer

желаемых выходов:

USA-2019--aoiwer
USA--jowerasf
BB-_owierlasdf-2019
flsfwer__2015-asfdlwer

мой код:

bind pub "-|-" !aa proc:aa
proc proc:aa { nick host handle channel arg } {

    set line [lindex $arg 0]

    set line [string map {[a-z] """} $line]
    set line [string map {[0-9] """} $line]


    putnow "PRIVMSG $channel :$line"
}

К сожалению, это не работает, и у меня нет другой идеи

Привет

1 Ответ

1 голос
/ 28 мая 2019

string map удалит все строчные буквы и цифры, если это сработает.Однако у вас также есть несбалансированные кавычки, что приводит к синтаксической ошибке при разрешении процедуры.

Я бы порекомендовал использовать regsub.Сложной частью, однако, было бы найти правильное выражение для выполнения задачи.Я предложу следующее:

bind pub "-|-" !aa proc:aa

proc proc:aa { nick host handle channel arg } {
    set line [lindex $arg 0]
    regsub -nocase -all {([^a-z0-9]|\y)[a-z0-9]([^a-z0-9]|\y)} $line {\1\2} line
    putnow "PRIVMSG $channel :$line"
}

В основном ([^a-z0-9]|\y) соответствует символу, который не является буквенно-цифровым, или границе слова (которая будет совпадать, например, в начале предложения, или наконец предложения) и сохраняет его (это цель паренов).

Соответствующие группы хранятся в порядке, начиная с 1, поэтому в заменяющей части regsub я помещаючасти, которые не следует заменять на прежние места.

Вышеприведенное должно работать нормально.


Технически вы могли бы пойти немного поудобнее с немного другим выражением:

regsub -nocase -all {([^a-z0-9]|\y)[a-z0-9](?![a-z0-9])} $line {\1} line

Который использует отрицательный прогноз ((?! ... )).

В любом случае, если вы хотите получить более подробную информацию, я рекомендую прочитать руководство о синтаксисе регулярных выражений

...