Как выяснить, что один или несколько символов в строке с регулярным выражением в TCL - PullRequest
1 голос
/ 30 июля 2011

Мне нужно простое решение, чтобы выяснить, есть ли некоторые символы в строке в Tcl. Моя идея состоит в том, чтобы сделать это с помощью регулярного выражения.

Моя строка выглядит так: "word_word-word_word_word-word" или "word.word.word.word-word". Моя проблема в том, что иногда я получаю строки, которые содержат . _ и -, тогда мне нужно вызвать другую процедуру для ее обработки.

Теперь снова вопрос, как выяснить, что строка содержит «_-_-» или «...-» с любыми словами между _ . -

1 Ответ

5 голосов
/ 30 июля 2011

Если бы вы просто смотрели, содержит ли строка _, -, _, - в этом порядке с произвольным случайным мусором между ними, мы могли бы сделать это двумя способами (вы можете заменить другоеразделители, но для . требуется специальная обработка в регулярном выражении; подойдет либо [.], либо \.):

regexp {_.+-.+_.+-} $stringToMatchAgainst
string match {*_*-*_*-*} $stringToMatchAgainst

OK, технически последний (сопоставление глобуса)соответствует чему-то немного другому, но эффект похож.

Однако я не уверен, что вышесказанное - это то, что вы действительно ищете.Похоже, вы действительно после word с?Возможно также разделители.

Чтобы получить список слов, мы используем несколько иную технику (не можем использовать \w, поскольку она также соответствует подчеркиванию, потому что это часто встречается в идентификаторах):

set wordList [regexp -all -inline {[a-zA-Z0-9]+} $stringToMatchAgainst]

Если вы также используете разделители, самый простой способ - использовать textutil::split::splitx из Tcllib:

package require textutil::split
set tokenList [textutil::split::splitx $stringToMatchAgainst {([-_.])} ]

В последнем случае с входной строкойword_word-word_word_word-word это дает такой вывод:

word _ word - word _ word _ word - word
...