Scala - Biểu thức chính quy

Chương này giải thích cách Scala hỗ trợ các biểu thức chính quy thông qua Regex lớp có sẵn trong gói scala.util.matching.

Hãy thử chương trình ví dụ sau, nơi chúng tôi sẽ cố gắng tìm ra từ Scala từ một tuyên bố.

Thí dụ

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.

Chỉ huy

\>scalac Demo.scala
\>scala Demo

Đầu ra

Some(Scala)

Chúng tôi tạo một chuỗi và gọi r( )phương pháp trên đó. Scala chuyển đổi hoàn toàn Chuỗi thành RichString và gọi phương thức đó để lấy một thể hiện của Regex. Để tìm đối sánh đầu tiên của biểu thức chính quy, chỉ cần gọifindFirstIn()phương pháp. Nếu thay vì chỉ tìm lần xuất hiện đầu tiên, chúng tôi muốn tìm tất cả các lần xuất hiện của từ phù hợp, chúng tôi có thể sử dụngfindAllIn( ) và trong trường hợp có nhiều từ Scala có sẵn trong chuỗi đích, điều này sẽ trả về một tập hợp tất cả các từ phù hợp.

Bạn có thể sử dụng phương thức mkString () để nối danh sách kết quả và bạn có thể sử dụng dấu ngoặc (|) để tìm kiếm chữ hoa và chữ thường của Scala và bạn có thể sử dụng Regex hàm tạo thay thế hoặc r() phương pháp tạo mẫu.

Hãy thử chương trình ví dụ sau.

Thí dụ

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.

Chỉ huy

\>scalac Demo.scala
\>scala Demo

Đầu ra

Scala,scala

Nếu bạn muốn thay thế văn bản phù hợp, chúng tôi có thể sử dụng replaceFirstIn( ) để thay thế trận đấu đầu tiên hoặc replaceAllIn( ) để thay thế tất cả các lần xuất hiện.

Thí dụ

object Demo {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.

Chỉ huy

\>scalac Demo.scala
\>scala Demo

Đầu ra

Java is scalable and cool

Tạo biểu thức chính quy

Scala kế thừa cú pháp biểu thức chính quy của nó từ Java, do đó nó thừa hưởng hầu hết các tính năng của Perl. Đây chỉ là một số ví dụ đủ để làm mới -

Sau đây là bảng liệt kê tất cả các cú pháp ký tự Meta biểu thức chính quy có sẵn trong Java.

Subexpression Diêm
^ Đối sánh đầu dòng.
$ Đối sánh với cuối dòng.
. Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới.
[...] Khớp bất kỳ ký tự đơn nào trong ngoặc.
[^ ...] Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc
\\ A Bắt đầu của toàn bộ chuỗi
\\ z Kết thúc toàn bộ chuỗi
\\ Z Kết thúc toàn bộ chuỗi ngoại trừ dấu chấm cuối dòng cuối cùng được phép.
lại * Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước.
lại + Khớp với 1 hoặc nhiều điều trước đó
lại? Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước.
lại {n} Khớp chính xác n số lần xuất hiện của biểu thức trước.
lại {n,} Khớp với n hoặc nhiều lần xuất hiện của biểu thức trước.
lại {n, m} Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước.
a | b Đối sánh với a hoặc b.
(lại) Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp.
(?: lại) Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp.
(?> lại) Khớp với mẫu độc lập mà không cần bẻ khóa ngược.
\\ w Khớp các ký tự từ.
\\ W Đối sánh các ký tự không phải từ khóa.
\\S Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f].
\\S Khớp với khoảng trắng.
\\ d Khớp các chữ số. Tương đương với [0-9].
\\ D Phù hợp với nondigits.
\\ A Đối sánh với phần đầu của chuỗi.
\\ Z Đối sánh với cuối chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới.
\\ z Đối sánh với cuối chuỗi.
\\ G Các trận đấu chỉ kết thúc trận đấu cuối cùng.
\\ n Tham chiếu ngược để nắm bắt số nhóm "n"
\\ b Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc.
\\ B Đối sánh các ranh giới không có từ khóa.
\\ n, \\ t, v.v. Khớp với dòng mới, dấu xuống dòng, tab, v.v.
\\ Q Escape (trích dẫn) tất cả các ký tự lên đến \\ E
\\ E Kết thúc trích dẫn bắt đầu bằng \\ Q

Ví dụ về Cụm từ Thông dụng

Thí dụ Sự miêu tả
. Khớp bất kỳ ký tự nào ngoại trừ dòng mới
[Rr] uby Khớp "Ruby" hoặc "ruby"
chà [anh em] Khớp "ruby" hoặc "rube"
[aeiou] Khớp với bất kỳ một nguyên âm chữ thường nào
[0-9] Khớp với bất kỳ chữ số nào; giống với [0123456789]
[az] Khớp với bất kỳ ký tự ASCII viết thường nào
[AZ] Khớp với bất kỳ ký tự ASCII viết hoa nào
[a-zA-Z0-9] Phù hợp với bất kỳ điều nào ở trên
[^ aeiou] Khớp bất kỳ thứ gì khác ngoài một nguyên âm viết thường
[^ 0-9] Khớp bất kỳ thứ gì khác ngoài một chữ số
\\ d Khớp một chữ số: [0-9]
\\ D Khớp với một nondigit: [^ 0-9]
\\S Khớp một ký tự khoảng trắng: [\ t \ r \ n \ f]
\\S Khớp với khoảng trắng: [^ \ t \ r \ n \ f]
\\ w Khớp một ký tự từ đơn: [A-Za-z0-9_]
\\ W Khớp một ký tự không phải từ khóa: [^ A-Za-z0-9_]
hồng ngọc? Đối sánh "rub" hoặc "ruby": y là tùy chọn
ruby * Khớp "chà" cộng với 0 hoặc nhiều y
ruby + Khớp "chà" cộng với 1 hoặc nhiều y
\\ d {3} Khớp chính xác 3 chữ số
\\ d {3,} Khớp 3 chữ số trở lên
\\ d {3,5} Khớp 3, 4 hoặc 5 chữ số
\\ D \\ d + Không có nhóm: + lặp lại \\ d
(\\ D \\ d) + / Đã nhóm: + lặp lại cặp \\ D \ d
([Rr] uby (,)?) + Đối sánh "Ruby", "Ruby, ruby, ruby", v.v.

Note- rằng mỗi dấu gạch chéo ngược xuất hiện hai lần trong chuỗi trên. Điều này là do trong Java và Scala, một dấu gạch chéo ngược là một ký tự thoát trong một chuỗi ký tự, không phải là một ký tự thông thường hiển thị trong chuỗi. Vì vậy, thay vì '\', bạn cần viết '\\' để nhận được một dấu gạch chéo ngược trong chuỗi.

Hãy thử chương trình ví dụ sau.

Thí dụ

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.

Chỉ huy

\>scalac Demo.scala
\>scala Demo

Đầu ra

able1