对单词边界感到困惑


13

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

因此,例如,有人可以向我解释此命令吗?

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

1
“单词边界”是所使用的工具定义的任何东西……有些人将nospace / space或space / nospace视为单词边界,而另一些人则认为“ word”由组成[azA-Z0-9_]。检查手册中的egrep(1),也许是正则表达式的用法。
vonbrand

Answers:


12

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

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

  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])和_均被视为文字字符。


因此,您发布的示例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

很好的解释,只需要注意Solaris' egrep(nor /usr/xpg4/bin/egrep)不会采用\b这种方式。例如,echo "FOOBAR" | egrep '\b[A-Z]+\b'将不匹配。
彼得

0
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 -就像整个单词搜索一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.