Answers:
如所描述的在这里,例如,它匹配之间的话:
有三个不同的位置可作为单词边界:
- 如果字符串中的第一个字符是单词字符,则在字符串中第一个字符之前。
- 如果字符串中的最后一个字符是单词字符,则在字符串的最后一个字符之后。
- 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
以下是每种情况的示例:
对于字符串foobar
,第一种情况匹配
foobar
^-----here
对于字符串foobar
,第二种情况匹配
foobar
^--here
对于字符串foo bar
,第三种情况将匹配
foo bar
^--here, because space is not a word character
符合字字符的条件取决于特定的正则表达式实现。但是,在所有情况下,字母([a-z]
和[A-Z]
),数字([0-9]
)和_
均被视为文字字符。
因此,您发布的示例regex(\b[A-Z]+\b
)意味着找到两个单词边界之间的最长字符串,该字符串仅包含大写字母。通过示例进行解释可能会更容易:
echo "FOOBAR" | egrep '\b[A-Z]+\b' # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b' # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b' # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars
egrep
(nor /usr/xpg4/bin/egrep
)不会采用\b
这种方式。例如,echo "FOOBAR" | egrep '\b[A-Z]+\b'
将不匹配。
egrep '\b[A-Z]+\b' filename.sh
让我们分解一下:
[A-Z]
表示字符类中的任何一个字符
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
。[A-Z]+
表示一个或多个大写字符。实施例的匹配将是:A
,HELLO
,IS
,I
,ELEPHANT
,等。'\bINDIA\b'
:就像一个全单词搜索INDIA
大写单词。它不匹配INDIANA
。因此,应用相同的原理- '\b[A-Z]+\b'
将查找具有一个或多个大写字母的整个单词。egrep '\b[A-Z]+\b' filename.sh
将在文件-中搜索全部以大写字母开头的一个或多个字母的单词filename.sh
。\b
-就像整个单词搜索一样。
[azA-Z0-9_]
。检查手册中的egrep(1)
,也许是正则表达式的用法。