regsub 1 пробел между словами до "_" - PullRequest
1 голос
/ 18 июня 2020

Может ли кто-нибудь помочь с regsub 1 пробел между словами в "_" (TCL)?

Исходная строка:

CTS__94331/I (DCCKBD8BWP240H11P57PDULVT)     0.025      0.002 &    0.352 r

Требуемая строка:

CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT)     0.025      0.002_&    0.352_r

Я пробовал следующее, но каждое пробел заменено на «», и я хочу, чтобы только 1 пробел был заменен на «»

regsub -all {\s{1}} $a _

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вам нужно быть более хитрым в регулярном выражении и использовать другую замену.

regsub -all {(\S)\s(?=\S)} $a {\1_}

Регулярное выражение сопоставляет (и захватывает) непробельный символ, за которым следует пробел, а затем требует (с опережением ограничение), что следующий символ не является пробелом и не соответствует ему. Он заменяется первым совпавшим символом (заменяя его самим собой) и подчеркиванием.


Обычно для такого рода вещей вы бы использовали \y\s\y_, но это не так. t работает в вашем случае использования, потому что он не обрабатывает 0.002 & правильно (& не является символом слова).

Если бы механизм RE Tcl поддерживал ограничения просмотра назад (это не так), это было бы намного проще решить, так как вам не потребуется трюк с заменой символа перед пробелом на себя.

0 голосов
/ 18 июня 2020

regsub 1 пробел между словами до «_»

В этом случае вы можете рассмотреть string map:

% string map {" " "_"} {CTS__94331/I (DCCKBD8BWP240H11P57PDULVT)}
CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT)

Однако данные вашего примера несовместимы, и я не вижу примера замены более чем одного пробела?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...