由一组括在括号中的字符组成的正则表达式称为字符类;它匹配任何一个封闭的字符。例如,
[AEIOU]
匹配任何字符A
、E
、I
、O
或U
。可以使用连字符在字符类中缩写字符范围。紧邻连字符左侧的字符定义范围的开始;紧邻右侧的字符定义结束。因此,
[0-9]
匹配任何数字,并[a-zA-Z][0-9]
匹配字母后跟数字。如果没有左操作数和右操作数,则字符类中的连字符表示其自身,因此字符类[+-]
和[-+]
匹配 a+
或 a-
。字符类[A-Za-z-]+
匹配包含连字符的单词。
[+-]
和 和有什么区别[-+]
?在我看来,它也在做同样的事情。做什么呢[A-Za-z-]+
?
$ awk '/[Y-Zy-z-]/' countries
India 1267 746 -Asia
$ awk '/[Y-Zy-z-]+/' countries
India 1267 746 -Asia
U 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
India 1267 746 -Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia
England 94 56 Europe
或者我尝试过
awk '/[^-]/' countries
我没有期望任何输出。
$ awk '/[^-]/ countries
U 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
India 1267 746 -Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia
England 94 56 Europe
答案1
文本指出,要匹配括号-
表达式 中的破折号, [...]
,破折号必须出现在 的第一个或最后[...]
(或紧接在首字母 后^
,如[^-]
匹配任何非破折号的单个字符)。
[+-]
和之间没有区别[-+]
。两者都匹配 a+
或 a -
。
该表达式[A-Za-z-]+
将匹配多个(大于零,因为在+
后面[...]
)ASCII 字符 from A
toZ
和 from a
toz
和破折号。破折号也可以放在前面,如 中所示[-A-Za-z]+
。
请注意,该表达式中的内部两个破折号表示范围而最后一个破折号(或第一个破折号[-A-Za-z]+
)表示字面破折号字符。
after修改表达式+
,[...]
使其匹配[...]
.如果没有+
,表达式将精确匹配一个字符,而不是带有可选破折号的单词。
第二个屏幕截图显示您正在[Y-Zy-z-]
匹配[Y-Zy-z-]+
某些数据。
对于这两种模式,您会得到相同的结果,因为这是唯一包含集合中一个或多个字符的行YZyz-
。匹配的字符就是-
子字符串中的字符-Asia
。
然后你尝试使用[^-]
.这匹配于全部行,因为所有行都包含一些不是-
.