Ответ 1
Я считаю, что это в основном ужасный недостаток дизайна.
Мы все ожидаем, что диапазоны будут сопоставляться на основе значения кода ASCII. Но они этого не делают - вместо этого диапазоны основаны на последовательности сортировки, которая почти соответствует последовательности по умолчанию, используемой SORT. EDIT. Точная последовательность сортировки, используемая FINDSTR, теперь доступна в fooobar.com/questions/28744/... в разделе под диапазонами классов символов Regex [xy ].
Я подготовил текстовый файл, содержащий одну строку для каждого расширенного символа ASCII от 1 до 255, за исключением 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
Сортировка сортирует верхний регистр перед нижним регистром. (EDIT - я просто прочитал справку для 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
Есть дополнительные символы, которые regex сортирует иначе, чем SORT, но у меня нет точного списка.