对单词边界感到困惑

对单词边界感到困惑

我对此进行了很多研究,但仍然不清楚。什么是字边界意思是?它有什么作用?

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

egrep '\b[A-Z]+\b' filename.sh

答案1

如上所述这里,例如,它匹配之间字:

三种不同的位置都可以作为单词边界:

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

以下是每种情况的示例:

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

     foobar
    ^-----here
    
  2. 对于字符串foobar,第二种情况匹配

    foobar
          ^--here
    
  3. 对于字符串foo bar,第三种情况将匹配

    foo bar
       ^--here, because space is not a word character
    

什么符合单词字符取决于特定的正则表达式实现。但在所有情况下,字母 ([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

答案2

egrep '\b[A-Z]+\b' filename.sh

让我们把它分解一下:

  1. [A-Z]代表字符类中的任意一个字符 [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
  2. [A-Z]+表示一次或多次出现大写字符。示例匹配为:AHELLOISIELEPHANT等。
  3. '\bINDIA\b'INDIA: 与大写单词的整个单词搜索完全相同。它会不是匹配INDIANA。因此应用相同的原则 -'\b[A-Z]+\b'将查找具有一个或多个大写字母的整个单词。
  4. 因此,egrep '\b[A-Z]+\b' filename.sh将在文件中搜索具有一个或多个大写字母的单词 - filename.sh

\b- 与全词搜索完全相同。

相关内容