窗口 – 为什么findstr不正确处理(在某些情况下)?
在cmd.exe中编写一些最近的脚本时,我需要使用findstr与正则表达式 – 客户需要的标准cmd.exe命令(没有GnuWin32,Cygwin,VBS或Power
shell).
我只想知道一个变量是否包含任何大写字符并尝试使用: > set myvar=abc > echo %myvar%|findstr /r "[A-Z]" abc > echo %errorlevel% 0 当%myvar%设置为abc时,实际输出字符串并将错误级别设置为0,表示找到匹配项. 但是,全名单变体: > echo %myvar%|findstr /r "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" > echo %errorlevel% 1 不输出行,并将错误级别正确设置为1. 此外: > echo %myvar%|findstr /r "^[A-Z]*$" > echo %errorlevel% 1 也按预期工作. 我显然在这里遗漏了一些东西,即使这只是findstr被破坏了的事实. 为什么第一(范围)正则表达式在这种情况下不起作用? 而更奇怪的是: > echo %myvar%|findstr /r "[A-Z]" abc > echo %myvar%|findstr /r "[A-Z][A-Z]" abc > echo %myvar%|findstr /r "[A-Z][A-Z][A-Z]" > echo %myvar%|findstr /r "[A]" 最后两个上面也没有输出字符串!
我相信这大概是一个可怕的设计缺陷.
我们都希望根据ASCII代码值对范围进行整理.但是它们不是 – 而是基于与SORT使用的默认序列几乎匹配的归类序列.编辑 – FINDSTR使用的确切的排序规则序列现在可在https://stackoverflow.com/a/20159191/1012053的标题为正则表达式字符类范围[x-y]的部分获得. 我准备了一个文本文件,每个扩展ASCII字符包含一行,从1到255,不包括10(LF),13(CR)和26(Windows上的EOF). 我现在可以轻松地测试这个排序文件的任何正则表达式范围,并演示如何通过与排序几乎相同的排序规则来确定范围. >findstr /nrc:"^[0-9]" sortedChars.txt 137:0 048 138:? 171 139:? 172 140:1 049 141:2 050 142:2 253 143:3 051 144:4 052 145:5 053 146:6 054 147:7 055 148:8 056 149:9 057 结果并不完全符合我们预期的那样,这些字符171,172和253被混合在一起.但结果是完美的.行号前缀对应于SORT归类序列,您可以看到范围根据SORT序列完全匹配. 这是另一个范围测试,完全遵循SORT序列: >findstr /nrc:"^[!-=]" sortedChars.txt 34:! 033 35:" 034 36:# 035 37:$036 38:% 037 39:& 038 40:( 040 41:) 041 42:* 042 43:,044 44:. 046 45:/ 047 46:: 058 47:; 059 48:? 063 49:@ 064 50:[ 091 51: 092 52:] 093 53:^ 094 54:_ 095 55:` 096 56:{ 123 57:| 124 58:} 125 59:~ 126 60:? 173 61:? 168 62:¢ 155 63:£ 156 64:¥ 157 65:? 158 66:+ 043 67:? 249 68:< 060 69:= 061 有一个小的异常与alpha字符.字符“a”在“A”和“Z”之间排序,但与[A-Z]不符. “Z”在“Z”之后排序,但与[A-Z]匹配. [a-z]有一个相应的问题. “A”在“a”之前排列,但它匹配[a-z]. “Z”在“a”和“z”之间排序,但与[a-z]不符. 以下是[A-Z]结果: >findstr /nrc:"^[A-Z]" sortedChars.txt 151:A 065 153:a 131 154:? 132 155:à 133 156:? 134 157:? 142 158:? 143 159:á 160 160:a 166 161:? 145 162:? 146 163:B 066 164:b 098 165:C 067 166:c 099 167:? 128 168:? 135 169:D 068 170:d 100 171:E 069 172:e 101 173:é 130 174:ê 136 175:? 137 176:è 138 177:é 144 178:F 070 179:f 102 180:? 159 181:G 071 182:g 103 183:H 072 184:h 104 185:I 073 186:i 105 187:? 139 188:? 140 189:ì 141 190:í 161 191:J 074 192:j 106 193:K 075 194:k 107 195:L 076 196:l 108 197:M 077 198:m 109 199:N 078 200:n 110 201:? 164 202:? 165 203:? 252 204:O 079 205:o 111 206:? 147 207:? 148 208:ò 149 209:? 153 210:ó 162 211:o 167 212:P 080 213:p 112 214:Q 081 215:q 113 216:R 082 217:r 114 218:S 083 219:s 115 220:? 225 221:T 084 222:t 116 223:U 085 224:u 117 225:? 150 226:ù 151 227:ú 163 228:ü 129 229:ü 154 230:V 086 231:v 118 232:W 087 233:w 119 234:X 088 235:x 120 236:Y 089 237:y 121 238:? 152 239:Z 090 240:z 122 而[a-z]结果 >findstr /nrc:"^[a-z]" sortedChars.txt 151:A 065 152:a 097 153:a 131 154:? 132 155:à 133 156:? 134 157:? 142 158:? 143 159:á 160 160:a 166 161:? 145 162:? 146 163:B 066 164:b 098 165:C 067 166:c 099 167:? 128 168:? 135 169:D 068 170:d 100 171:E 069 172:e 101 173:é 130 174:ê 136 175:? 137 176:è 138 177:é 144 178:F 070 179:f 102 180:? 159 181:G 071 182:g 103 183:H 072 184:h 104 185:I 073 186:i 105 187:? 139 188:? 140 189:ì 141 190:í 161 191:J 074 192:j 106 193:K 075 194:k 107 195:L 076 196:l 108 197:M 077 198:m 109 199:N 078 200:n 110 201:? 164 202:? 165 203:? 252 204:O 079 205:o 111 206:? 147 207:? 148 208:ò 149 209:? 153 210:ó 162 211:o 167 212:P 080 213:p 112 214:Q 081 215:q 113 216:R 082 217:r 114 218:S 083 219:s 115 220:? 225 221:T 084 222:t 116 223:U 085 224:u 117 225:? 150 226:ù 151 227:ú 163 228:ü 129 229:ü 154 230:V 086 231:v 118 232:W 087 233:w 119 234:X 088 235:x 120 236:Y 089 237:y 121 238:? 152 240:z 122 排序在小写前排序大写. (编辑 – 我只是阅读了SORT的帮助,并了解到它不区分大小写,我的SORT输出一直保持在较低位置之前的事实可能是输入顺序的结果)但正则表达式显然排序大写字母之前的小写字母.以下所有范围都不匹配任何字符. >findstr /nrc:"^[A-a]" sortedChars.txt >findstr /nrc:"^[B-b]" sortedChars.txt >findstr /nrc:"^[C-c]" sortedChars.txt >findstr /nrc:"^[D-d]" sortedChars.txt 反转顺序找到字符. >findstr /nrc:"^[a-A]" sortedChars.txt 151:A 065 152:a 097 >findstr /nrc:"^[b-B]" sortedChars.txt 163:B 066 164:b 098 >findstr /nrc:"^[c-C]" sortedChars.txt 165:C 067 166:c 099 >findstr /nrc:"^[d-D]" sortedChars.txt 169:D 068 170:d 100 还有其他正则表达式的字符与SORT不同,但我没有一个精确的列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 设置windows service方式启动GitBlit
- Azure VM Windows数据磁盘 – 如何知道它是HDD还是SSD?
- Windows本地上传源码到Gitee远程仓库
- Windows-8 – 未调用Metro / WinRT UI异步void事件处理程序
- 如何在Windows上切换到另一个应用程序(使用C,Qt)?
- windows – 笔记本电脑备份软件(企业)?
- winforms – Windows窗体应用程序性能
- Windows批处理脚本解压缩目录中的文件
- windows-server-2003 – Windows Server 2003 – 不活动注销
- windows-phone-7 – MVVM-light已经有一个为INavigationSer