поиск по списку для поиска точных совпадений с использованием TCL lsearch - PullRequest
0 голосов
/ 13 июля 2020

У меня есть список, и мне нужно найти в нем несколько строк. Мой список выглядит следующим образом:

list1 = {slt0_reg_11.CK slt0_reg_11.Q slt0_reg_12.CK slt0_reg_12.Q}

Я пытаюсь использовать lsearch, чтобы проверить, включает ли приведенный выше список какие-то строки или нет. Строки похожи на:

string1 = {slt0_reg_1 slt0_reg_1}

Я делаю следующее, чтобы проверить это:

set listInd [lsearch -all -exact -nocase -regexp $list1 $string1]

Эта команда дает индексы, если list1 включает $ string1 (это то, что я хочу). Однако проблема в том, что если у меня есть строка типа slt0_reg_1, указанная выше команда идентифицирует первые два элемента списка (slt0_reg_11.CK slt0_reg_11.Q), потому что они покрывают строку, которую я ищу.

Как я могу сделать точный поиск?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Похоже, вы хотите добавить ограничения на границы слов (\y) в свой RE. (Не используйте -exact и -regexp одновременно; только один из этих режимов может использоваться в любом прогоне, потому что они меняют используемый механизм сравнения.) Следует проявлять небольшую осторожность, потому что мы не можем заключить RE в фигурных скобках, поскольку мы хотим произвести в нем замену переменных.

set list1 {slt0_reg_11.CK slt0_reg_11.Q slt0_reg_12.CK slt0_reg_12.Q}

foreach str {slt0_reg_11 slt0_reg_1} {
    set matches [lsearch -all -regexp $list1 "\\y$str\\y"]
    puts "$str: $matches"
}

Выводит:

slt0_reg_11: 0 1
slt0_reg_1: 
1 голос
/ 13 июля 2020

Если вы хотите сравнить свой список на точное соответствие части перед точкой с другим списком, вам может быть лучше использовать lmap:

set index -1
set listInd [lmap str $list1 {
    incr index
    if {[lindex [split $str .] 0] ni $string1} continue
    set index
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...