1. regexp 命令
regexp 匹配正则表达式与字符串,它的语法为:
- regexp ?switches ? exp string ?matchvar? ?subMatchVar ... subMatchVar?
regexp 命令比较字符串 string 是否与正则表达式 exp 部分或者全部匹配,并可以将字符串中的子字符串提取出来。如果字符串的某个子字符串和正则表达式匹配,则返回1,否则返回 0。
如果在 string 变量后面,还有其它的变量(称之为匹配变量, match variables),则这些变量就保存了那些与正则表达式匹配的子字符串信息(如可能是子字符串的实际内容,或者是界定子字符串的起始、结束的索引数字)。 matchVar 保存了匹配 exp 的字符串,而 subMatchVar 依次存放了和 exp 各个中单个括号语法(子模式)匹配的子字符串。
regexp 中的 switches 是命令开关选项,这些选项主要有:
选项 | 说明 |
-nocase | exp 中的小写字符可以匹配 string 中的大写和小写字符 |
-indices | 返回界定 string 中匹配区间起始、结束的索引数值。否则返回匹配区间内字符串本身 |
-expanded | 使用扩展语法 |
-line | 等价于同时指定-lineanchor 和-linestop |
-lineanchor | 将^和$的行为改为面向行的方式 |
-linestop | 将匹配方式改变成和字符类不匹配换行符 |
-about | 适用于调试,返回有关模式的信息而不是试图与输入进行匹配 |
-all | 让正则表达式在 string 中匹配所有的匹配子字符串,返回匹配次数,而且将最后一次匹配结果存入匹配变量 |
-inline | 将原来存放在匹配变量中的值以列表的形式返回,如果同时使用了-all,则返回所有满足匹配结果的值的列表。 |
-start index | 用 index 指定 exp 在 string 中起始匹配位置。如果使用了-indices,返回的索引是从输入字符串 string 的绝对起始位置算起而不是从 index 指定位置算起 |
-- | 结束选项,如果表达式以-开始, 则需先用此选项 |
regexp示例:
set sample "Where there is a will, There is a way."
=> Where there is a will, There is a way.
set result [regexp {will} $sample match var1]
=> 1
puts "match = $match, var1 = $var1"
=> match = will,var1 =
set result [regexp {([a-z]+) ([a-z]+) ([a-z]+)} $sample mStr var1 var2 var3] #匹配字母a-z
=> 1
puts "maStr = $maStr, var1 = $var1, var2 = $var2, var3 = $var3"
=> maStr = here there is, var1 = here, var2 = there, var3 = is
带有 nocase 选项的 regexp 命令 :
set result [regexp -nocase {([a-z]+) ([a-z]+) ([a-z]+)} $sample mStr var1 var2 var3]
=> 1
puts "maStr = $maStr, var1 = $var1, var2 = $var2, var3 = $var3"
=> maStr = Where there is, var1 = Where, var2 = there, var3 = is
指明需要返回索引数值而不是字符串本身:
set result [regexp -indices {([a-z]+) ([a-z]+) ([a-z]+)} $sample mStr var1 var2 var3]
=> 1
puts "maStr = $maStr, var1 = $var1, var2 = $var2, var3 = $var3"
=> maStr = 1 13, var1 = 1 4, var2 = 6 10, var3 = 12 13
2. regsub 命令
regsub 命令基于正则表达式完成字符串匹配和替换。
语法:
- regsub ?switches? exp string subSpec varName
switches 是命令开关选项,主要有:
-
开关选项-nocase、 -expanded、 -line、 -linestop、 -lineanchor、 -start index 和--与 regexp 命令开关选项作用相同
- -all 对所有满足匹配条件的字符串范围进行替换,返回匹配和替换的次数。没有此选项时,只匹配第一个满足匹配条件的匹配范围并用 subSpec 替换之。
替换模式 subSpec 可以是普通字符,也可以含有&和\x( x 是一个数字)。当是这两个特殊字符时, &和\x 就会被替换成与 exp 中的对应模式匹配的 string 中的匹配范围内的字符。
varName 存放替换后的字符串。
示例:
set sample "Where there is a will, There is a way."
=>Where there is a will, There is a way.
regsub "way" $sample "lawsuit" sample2
=> 1
puts "New:$sample2"
=> New:Where there is a will, There is a lawsuit.
使用&和\0 的 subSpec:
regsub {([a-z]+) ([a-z]+)} $sample {"-&- lawsuit -\1- -\2-"} sample2
puts "New:$sample2"
=> New:W"-here there- lawsuit -here- -there-" is a wail, There is a way.
标签:var1,var3,var2,正则表达式,regexp,字符串,匹配 From: https://www.cnblogs.com/love-9/p/18141930