微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

窗口 – 为什么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).
在每行上,我有字符,后跟一个空格,后跟字符的十进制代码.然后我通过SORT运行文件,并在sortedChars.txt文件中捕获输出.

我现在可以轻松地测试这个排序文件的任何正则表达式范围,并演示如何通过与排序几乎相同的排序规则来确定范围.

>findstr /nrc:"^[0-9]" sortedChars.txt
137:0 048
138:½ 171
139:¼ 172
140:1 049
141:2 050
142:² 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:â 131
154:ä 132
155:à 133
156:å 134
157:Ä 142
158:Å 143
159:á 160
160:ª 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:º 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:â 131
154:ä 132
155:à 133
156:å 134
157:Ä 142
158:Å 143
159:á 160
160:ª 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:º 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不同,但我没有一个精确的列表.

原文地址:https://www.jb51.cc/windows/371355.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐