对单词边界感到困惑

use*_*683 15 grep regular-expression

我一直在研究这个很多,但我仍然不清楚。这是什么字边界是什么意思?它有什么作用?

那么,例如,有人可以向我解释这个命令吗?

egrep '\b[A-Z]+\b' filename.sh
Run Code Online (Sandbox Code Playgroud)

ter*_*don 12

如所描述的在这里,例如,它匹配之间的话:

有三个不同的位置可以作为单词边界:

  1. 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  2. 在字符串的最后一个字符之后,如果最后一个字符是单词字符。
  3. 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

以下是每种情况的示例:

  1. 对于字符串foobar,第一种情况匹配

     foobar
    ^-----here
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于字符串foobar,第二种情况匹配

    foobar
          ^--here
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于字符串foo bar,第三种情况将匹配

    foo bar
       ^--here, because space is not a word character
    
    Run Code Online (Sandbox Code Playgroud)

什么是单词字符取决于特定的正则表达式实现。但是,在所有情况下,字母 ([a-z][A-Z])、数字 ( [0-9]) 和_都被视为单词字符。


因此,您发布的示例正则表达式 ( \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
Run Code Online (Sandbox Code Playgroud)