继续第一部分的回答-我已经达到了30,000个字符的回答限制:-(
有限的正则表达式支持
FINDSTR对正则表达式的支持非常有限。如果HELP文档中没有,则不支持。
除此之外,所支持的regex表达式是以完全非标准的方式实现的,因此结果可能与来自grep或perl等程序的预期结果不同。
正则表达式行位置锚^和$
^匹配输入流的开始以及紧跟在<LF>后面的任何位置。因为FINDSTR也会在<LF>之后换行,所以简单的“^”正则表达式将始终匹配文件中的所有行,甚至是二进制文件。
$匹配紧挨着<CR>之前的任何位置。这意味着包含$的正则表达式搜索字符串永远不会匹配Unix样式文本文件中的任何行,如果缺少EOL标记<CR><LF>,它也不会匹配Windows文本文件的最后一行。
注意-如前所述,管道和重定向到FINDSTR的输入可能附加了不在源中的<CR><LF>。显然,这会影响使用$的正则表达式搜索。
任何在^之前或$之后有字符的搜索字符串总是找不到匹配。
位置选项/B /E /X
位置选项的工作原理与^和$相同,除了它们也适用于文字搜索字符串。
/B的功能与正则表达式搜索字符串开头的^相同。
/E的功能与正则表达式搜索字符串末尾的$相同。
/X的功能与正则表达式搜索字符串的开头和结尾都有^和$相同。
正则表达式字边界
\<必须是正则表达式中的第一个项。如果正则表达式前面有其他字符,则正则表达式将不匹配任何字符。\<对应于输入的最开始,一行的开始(紧跟在<LF>后面的位置),或者紧跟在任何“非单词”字符后面的位置。下一个字符不必是“单词”字符。
\>必须是正则表达式中的最后一项。如果正则表达式后面有其他字符,则它将不匹配任何字符。\>对应于输入的结尾,紧挨着<CR>之前的位置,或者紧挨着任何“非单词”字符之前的位置。前面的字符不必是“word”字符。
下面是“非单词”字符的完整列表,用十进制字节代码表示。注意:这个列表是在一台美国机器上编译的。我不知道其他语言对这个列表会有什么影响。
001 028 063 179 204 230
002 029 064 180 205 231
003 030 091 181 206 232
004 031 092 182 207 233
005 032 093 183 208 234
006 033 094 184 209 235
007 034 096 185 210 236
008 035 123 186 211 237
009 036 124 187 212 238
011 037 125 188 213 239
012 038 126 189 214 240
014 039 127 190 215 241
015 040 155 191 216 242
016 041 156 192 217 243
017 042 157 193 218 244
018 043 158 194 219 245
019 044 168 195 220 246
020 045 169 196 221 247
021 046 170 197 222 248
022 047 173 198 223 249
023 058 174 199 224 250
024 059 175 200 226 251
025 060 176 201 227 254
026 061 177 202 228 255
027 062 178 203 229
正则表达式字符类别范围[x-y]
字符类别范围不能正常工作。请看这个问题:为什么findstr不能正确地处理case(在某些情况下)?,并附上这个答案:https://stackoverflow.com/a/8767815/1012053。
问题是FINDSTR不按字节码值(通常认为是ASCII码,但ASCII仅从0x00 - 0x7F定义)对字符进行排序。大多数regex实现将[A-Z]视为所有大写英文大写字母。但是FINDSTR使用大致对应于SORT工作方式的排序序列。所以[a - z]包括完整的英语字母,包括大写字母和小写字母(除了“a”),以及带变音符的非英语alpha字符。
下面是FINDSTR支持的所有字符的完整列表,按照FINDSTR用于建立正则表达式字符类范围的排序顺序进行排序。字符以十进制字节码值表示。如果使用代码页437查看字符,我认为排序顺序最有意义。注意:这个列表是在一台美国机器上编译的。我不知道其他语言对这个列表会有什么影响。
001
002
003
004
005
006
007
008
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
127
039
045
032
255
009
010
011
012
013
033
034
035
036
037
038
040
041
042
044
046
047
058
059
063
064
091
092
093
094
095
096
123
124
125
126
173
168
155
156
157
158
043
249
060
061
062
241
174
175
246
251
239
247
240
243
242
169
244
245
254
196
205
179
186
218
213
214
201
191
184
183
187
192
212
211
200
217
190
189
188
195
198
199
204
180
181
182
185
194
209
210
203
193
207
208
202
197
216
215
206
223
220
221
222
219
176
177
178
170
248
230
250
048
172
171
049
050
253
051
052
053
054
055
056
057
236
097
065
166
160
133
131
132
142
134
143
145
146
098
066
099
067
135
128
100
068
101
069
130
144
138
136
137
102
070
159
103
071
104
072
105
073
161
141
140
139
106
074
107
075
108
076
109
077
110
252
078
164
165
111
079
167
162
149
147
148
153
112
080
113
081
114
082
115
083
225
116
084
117
085
163
151
150
129
154
118
086
119
087
120
088
121
089
152
122
090
224
226
235
238
233
227
229
228
231
237
232
234
Regex character class term limit and BUG
Not only is FINDSTR limited to a maximum of 15 character class terms within a regex, it fails to properly handle an attempt to exceed the limit. Using 16 or more character class terms results in an interactive Windows pop up stating "Find String (QGREP) Utility has encountered a problem and needs to close. We are sorry for the inconvenience." The message text varies slightly depending on the Windows version. Here is one example of a FINDSTR that will fail:
echo 01234567890123456|findstr [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
DosTips用户Judago在这里报告了这个错误。在XP、Vista和Windows 7上已经得到确认。
Regex searches fail (and may hang indefinitely) if they include byte code 0xFF (decimal 255)
Any regex search that includes byte code 0xFF (decimal 255) will fail. It fails if byte code 0xFF is included directly, or if it is implicitly included within a character class range. Remember that FINDSTR character class ranges do not collate characters based on the byte code value. Character <0xFF> appears relatively early in the collation sequence between the <space> and <tab> characters. So any character class range that includes both <space> and <tab> will fail.
具体的行为根据Windows版本稍有不同。如果包含0xFF, Windows 7将无限期挂起。XP不会挂起,但它总是找不到匹配的,并偶尔打印以下错误消息——“进程试图写入不存在的管道。”
我不能再使用Vista的机器,所以我不能在Vista上测试。
正则表达式错误:。和[^anySet]可以匹配End-Of-File
正则表达式。元字符只能匹配除<CR>或<LF>之外的任何字符。如果文件中的最后一行不以<CR>或<LF>结束,则允许它匹配End-Of-File。然而,。将不匹配空文件。
例如,一个名为"test.txt"的文件包含一行x,没有终止<CR>或<LF>,将匹配以下内容:
findstr /r x......... test.txt
这个bug已经在XP和Win7上得到确认。
负字符集似乎也是如此。像[^abc]这样的东西将匹配End-Of-File。像[abc]这样的正面字符集似乎很有效。我只在Win7上测试过这个功能。