我相信這是一個可怕的設計缺陷。
我們都希望根據ASCII碼值來整理範圍。但它們不是 - 而是範圍基於排序順序,幾乎匹配SORT使用的默認順序。EDIT通過FINDSTR使用-The確切歸類序列現在可以在https://stackoverflow.com/a/20159191/1012053下標題的Regex字符類範圍[X-Y]部分。
我準備了一個文本文件,其中包含1到255的每個擴展ASCII字符的一行,不包括10(LF),13(CR)和26(EOF在Windows上)。 在每行上我都有字符,後跟一個空格,後面跟着字符的十進制代碼。然後我通過SORT運行該文件,並在sortedChars.txt文件中捕獲輸出。
我現在可以很容易地測試任何正則表達式範圍對這個排序文件,並演示範圍是如何通過與SORT幾乎相同的排序順序來確定的。
>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
有一個小的異常與字母字符。字符「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
還有其他的字符,正則表達式排序不同於排序,但我還沒有一個確切的清單。
以及FINDSTR的幫助顯示/ I開關設置不區分大小寫的模式,但我不能讓FINDSTR是大小寫敏感的,無論我用什麼樣的範圍內,太! – Axarydax 2010-04-14 08:05:07
在我最初的錯誤開始後,我只能第二次(或第三次)兩次觀察。您已經爲findstr中的某個bug顯示瞭解決方法...使用完整列表變體。 – 2010-04-14 08:54:25
只是一個註釋:'echo%myvar%| findstr/r'^ [AZ] * $「'實際上並不工作,如果將''^ [AZ] * $」'更改爲'abc' '「^ [AZ] * $」',它仍然會輸出'abc',如[AZ]中所示,並且錯誤級別爲0 – YOU 2010-04-14 10:12:52