2

一段时间以来,我一直想知道 Tcl 中的正则表达式匹配模式,但我一直不知道它是如何工作的。顺便说一句,我正在使用 Wish 和 Tcl/Tk 8.5。

MmmasidhmMm存储了一个随机字符串,$line我拥有的代码是:

while {[regexp -all {[Mm]} $line match]} {
    puts $data $match
    regsub {[Mm]} $line "" line
}

$data是一个文本文件。

这就是我得到的:

m
m
m
m
m
m

在我期待的时候:

M
m
m
m
M
m

当我得到这个时,我正在尝试一些事情来看看改变一点会如何影响结果:

while {[regexp -all {^[Mm]} $line match]} {
    puts $data $match
    regsub {[Mm]} $line "" line
}

我得到:

M
m
m

令人惊讶的是,$match保持这种情况。

我想知道为什么在第一种情况下,$match由于某种原因自动变为小写。除非我不了解正则表达式实际上是如何工作的,否则我不确定我可能做错了什么。也许有一个我不知道的修复它的标志?

我不确定有一天我是否真的会使用这种代码,但我想了解它的工作原理可能会在其他方面对我有所帮助。我希望我没有错过那里的任何东西。如果您需要更多信息,请与我们联系!

4

1 回答 1

5

这里的关键在你的-all旗帜里。该文件说:

-all-- 使正则表达式在字符串中尽可能多地匹配,返回找到的匹配总数。如果这是用匹配变量指定的,它们将只包含最后一次匹配的信息。

这意味着变量match包含最后一个匹配项,即小写的“m”。放下-all旗帜,你会得到你想要的。

更新

如果您的目标是删除所有“m”而不考虑大小写,则可以将整个代码块压缩为一行:

regsub -all {[MM]} $line "" line

或者,更直观地说:

set line [string map -nocase {m ""} $line]; # Map all M's into nothing
于 2013-03-29T13:39:31.347 回答