Nhầm lẫn về ranh giới từ


13

Tôi đã nghiên cứu điều này rất nhiều, nhưng tôi vẫn chưa rõ về nó. Làm những gì từ ranh giới nghĩa là gì? Nó làm gì?

Vì vậy, ví dụ, ai đó có thể giải thích lệnh này cho tôi không?

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

1
"Ranh giới từ" là bất cứ điều gì công cụ được sử dụng định nghĩa như vậy ... một số người coi không gian / không gian hoặc không gian / không gian / ranh giới từ, một số khác coi "từ" là bao gồm [azA-Z0-9_]. Kiểm tra hướng dẫn egrep(1), có lẽ là nhân đôi cho các biểu thức thông thường đang sử dụng.
vonbrand

Câu trả lời:


12

Như được mô tả ở đây , ví dụ, nó khớp giữa các từ:

Có ba vị trí khác nhau đủ điều kiện làm ranh giới từ:

  1. Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
  2. Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là ký tự từ.
  3. Giữa hai ký tự trong chuỗi, trong đó một ký tự là từ và ký tự kia không phải là ký tự từ.

Dưới đây là ví dụ về từng trường hợp:

  1. Đối với chuỗi foobar, trường hợp đầu tiên khớp

     foobar
    ^-----here
    
  2. Đối với chuỗi foobar, trường hợp thứ hai khớp

    foobar
          ^--here
    
  3. Đối với chuỗi foo bar, trường hợp thứ ba sẽ khớp

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

Những gì đủ điều kiện là một ký tự từ phụ thuộc vào việc thực hiện biểu thức chính quy cụ thể. Tuy nhiên, trong mọi trường hợp, chữ cái ( [a-z][A-Z]), số ( [0-9]) và _được coi là ký tự từ.


Vì vậy, ví dụ regex bạn đã đăng ( \b[A-Z]+\b) có nghĩa là tìm chuỗi dài nhất nằm giữa hai ranh giới từ và chỉ bao gồm các chữ cái viết hoa. Có thể dễ dàng hơn để giải thích bằng ví dụ:

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

Giải thích tuyệt vời, chỉ cần lưu ý rằng Solaris ' egrep(cũng không /usr/xpg4/bin/egrep) không đối xử \btheo cách này. Ví dụ, echo "FOOBAR" | egrep '\b[A-Z]+\b'sẽ không phù hợp.
Peter

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

Hãy phá vỡ nó:

  1. [A-Z]đại diện cho bất kỳ một nhân vật trong lớp nhân vật [ABCDEFGHIJKLMNOPQRSTUVWXYZ].
  2. [A-Z]+đại diện cho một hoặc nhiều sự xuất hiện của các ký tự chữ hoa Ví dụ trận đấu sẽ là: A, HELLO, IS, I, ELEPHANT,, vv
  3. '\bINDIA\b': chính xác giống như tìm kiếm WHOLE WORD cho từ INDIAin hoa. Nó sẽ không phù hợp INDIANA. Do đó, áp dụng cùng một nguyên tắc - '\b[A-Z]+\b'sẽ tìm kiếm toàn bộ các từ có một hoặc nhiều chữ cái viết hoa.
  4. Do đó, egrep '\b[A-Z]+\b' filename.shsẽ tìm kiếm các từ có một hoặc nhiều chữ cái in hoa trong tệp - filename.sh.

\b - chính xác như một tìm kiếm toàn bộ từ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.