【问题标题】:Need Help on Tcl RegExp在 Tcl RegExp 上需要帮助
【发布时间】:2013-02-25 00:11:06
【问题描述】:

我想匹配如下所示的模式,它是一个环境变量,后跟一个目录名称。我想完全匹配这两个词。如果匹配则返回 1。

$::env(WORK)/bill/

如何在 TCL 中使用 regexp 做到这一点?
我是新手,所以任何帮助表示赞赏。 谢谢。

我已经试过了,它可以工作:

if {![file isdirectory "${::env(WORK)}/bill/"]} {} else { return 1} 

使用 RE: 正则表达式 {^(bill)$} 用于第二个单词。第一个词,因为它是环境变量,所以我卡在那里

【问题讨论】:

  • 我已经尝试过了,它可以工作: if {![file isdirectory "${::env(WORK)}/bill/"]} {} else { return 1} 但是我想要用正则表达式试试
  • regexp {^(bill)$} 表示第二个单词。第一个词,因为它是环境变量,所以我卡在那里
  • 既然你已经有了一些有用的东西,你有什么理由需要正则表达式吗?

标签: regex tcl


【解决方案1】:

让我们看看我是否理解你的问题。你有一个 Tcl 字符串并且你想匹配一个模式 $::env(something)/somethingelse/ 识别 somethingsomethingelse 部分。

如果是这样,那么你想使用somethink like

set str {$::env(WORK)/bill/}
if {[regexp {\$::env\((.+)\)/(.+)/} $string -> envName dirName]} {
    puts $envName
    puts $dirName
}

你应该有

WORK
bill

打印在您的终端上。

regexp 命令中,该模式包含在{} 中以避免Tcl 替换。它以转义的美元 \$ 开头,因为美元将匹配行尾。然后是文字::env。然后转义括号 \(...\) 以匹配数组语法。在它们中,我们有一个捕获原子(.+),用于匹配任何重复一次或多次的字符,并报告。然后跟随文字斜线/.../ 和第二个捕获原子(.+) 以匹配目录部分。

-> 是一个变量的名称,它将包含$str 中与模式匹配的所有内容(您可以通过使用puts ${->} 打印它来查看它),但在这种情况下不需要它,所以我们使用奇怪的名字。

然后是两个 var 名称,envNamedirName,它们将分别报告第一个和第二个原子 (.+) 的匹配(括号除外)。

编辑对于非贪婪匹配,正如 Donal Fellows 所指出的,您可以使用 (.+?) 而不是 (.+),我同意这是一个不错的添加。

我希望这能满足您的需求。

【讨论】:

  • 它可能应该使用非贪婪的 REs 或合适的否定集(这样您就不会对输入字符串中存在正确匹配点的情况感到惊讶)。否则,这看起来是一种非常合理的方法。
  • 非常感谢!马可·帕兰特
  • 嗨,Pallante 提供的解决方案确实有效,但是当您真的想按原样匹配 $::env(WORK) 时。但在我的情况下, $::env(WORK) 实际上是一个环境变量,可以打开以下路径。所以,当我进行正则表达式匹配时,我希望那时整个路径都被替换。例如 setenv WORK /tmp/somedir/somedir/。当我穿上 $::WORK 时,我在 Tcl 提示符下得到 $> /tmp/somedir/somedir。
  • @arkanoid 这与你原来的问题有很大不同,你应该问一个新问题。没关系。在你的新问题中要非常具体,比如你从什么开始,你想达到什么,你期望的值有什么变化(对 RE 很重要),以及你在陷入困境之前已经尝试过哪些解决方案。您可能还应该链接到这个问题(但请确保您没有问同样的问题!)
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2011-07-10
  • 2011-06-23
  • 2014-11-04
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多