我一直想知道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
由于某种原因自动变为小写。除非我不理解regexp实际上是如何工作的,否则我不确定我做错了什么。也许有一个标志可以解决我不知道的问题?
我不确定某天我会真正使用这种代码,但我想学习它的工作原理可能会在其他方面帮助我。我希望我没有错过任何东西。如果您需要更多信息,请告诉我们!
答案 0 :(得分: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