2008-08-07 43 views
10

Tôi đã làm việc trong 5 năm chủ yếu trong các ứng dụng máy tính để bàn java truy cập cơ sở dữ liệu Oracle và tôi chưa bao giờ sử dụng các biểu thức chính quy. Bây giờ tôi vào Stack Overflow và tôi thấy rất nhiều câu hỏi về chúng; Tôi cảm thấy như tôi đã bỏ lỡ một cái gì đó.Cụm từ thông dụng tốt là gì?

Đối với những gì bạn sử dụng cụm từ thông dụng?

P.S. xin lỗi vì tiếng anh xấu của tôi

+0

Đừng quên đọc Javadocs cho java.util.regex.Pattern. Đó là một tài liệu tham khảo tốt. Ngoài ra http://perldoc.perl.org/perlre.html –

Trả lời

7

Hãy xem xét một ví dụ trong Ruby:

puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil? 
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil? 

Các "/ \ d {3} - \ d {4}/"là cụm từ thông dụng, và bạn có thể thấy nó là VERY co ncise cách tìm một trận đấu trong một chuỗi.

Bên cạnh đó, sử dụng các nhóm bạn có thể trích xuất thông tin, như vậy:

match = /([^@]*)@(.*)/.match("[email protected]") 
name = match[1] 
domain = match[2] 

Ở đây, ngoặc trong biểu thức chính quy đánh dấu một nhóm chụp, vì vậy bạn có thể thấy chính xác những gì các dữ liệu là bạn phù hợp, vì vậy bạn có thể xử lý thêm.

Đây chỉ là đỉnh của tảng băng trôi ...có rất nhiều điều khác nhau mà bạn có thể làm trong một biểu thức chính quy làm cho văn bản xử lý REALLY dễ dàng.

0

Cụm từ thông dụng (regex hoặc regexp viết tắt) là chuỗi văn bản đặc biệt để mô tả mẫu tìm kiếm. Bạn có thể nghĩ về các biểu thức chính quy như các ký tự đại diện trên steroid. Có thể bạn đã quen với các ký hiệu ký tự đại diện như *.txt để tìm tất cả các tệp văn bản trong trình quản lý tệp. Tương đương regex là .*\.txt$.

Một nguồn lực lớn cho biểu thức thông thường: http://www.regular-expressions.info

7

Regular Expressions (hoặc Regex) được sử dụng để mô hình phù hợp trong chuỗi. Do đó, bạn có thể kéo ra tất cả các địa chỉ email từ một đoạn văn bản bởi vì nó tuân theo một mẫu cụ thể.

Trong một số trường hợp, cụm từ thông dụng được đính kèm trong dấu gạch chéo và sau dấu gạch chéo thứ hai được đặt tùy chọn chẳng hạn như phân biệt chữ hoa chữ thường. Đây là một điều tốt :)

/(bb|[^b]{2})/i 

Nói nó có thể đọc "2 hoặc không 2".

Phần đầu tiên là (dấu ngoặc vuông), chúng được chia theo đường ống | ký tự tương đương với một hoặc câu lệnh sao cho (a | b) khớp với "a" hoặc "b". Nửa đầu của khu vực đường ống khớp với "bb". Tên của nửa sau tôi không biết nhưng đó là các dấu ngoặc vuông, chúng khớp với bất kỳ thứ gì là không phải là "b", đó là lý do tại sao có biểu tượng mái nhà (thuật ngữ kỹ thuật) ở đó. Các dấu ngoặc nhọn phù hợp với một số điều trước chúng, trong trường hợp này hai ký tự không phải là "b".

Sau lần thứ hai/là "i" khiến trường hợp này không phân biệt chữ hoa chữ thường. Sử dụng dấu gạch chéo bắt đầu và kết thúc là môi trường cụ thể, đôi khi bạn làm và đôi khi bạn không.

Hai liên kết mà tôi nghĩ rằng bạn sẽ tìm thấy tiện dụng cho điều này là

  1. regular-expressions.info
  2. Wikipedia - Regular expression
+0

Đó là một mô tả hay, nhưng ví dụ thực tế của Mike là thích hợp hơn với '2b' xảo quyệt. Sẽ rất tuyệt khi kết hợp cả hai. –

+0

'squiggly' ngoặc đơn liên quan đến' 2' không phải là phổ biến, họ là 'xoăn' .. – Timo

0

Như bạn đã biết, Oracle hiện có các biểu thức chính quy: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html. Tôi đã sử dụng chức năng mới trong một vài truy vấn, nhưng nó không hữu ích như trong các ngữ cảnh khác. Lý do, tôi tin, là các biểu thức thông thường phù hợp nhất cho việc tìm kiếm dữ liệu có cấu trúc được chôn trong dữ liệu phi cấu trúc.

Ví dụ: tôi có thể sử dụng regex để tìm thư của Oracle được nhồi trong tệp nhật ký. Không thể biết được thông điệp ở đâu - chỉ những gì họ trông giống. Vì vậy, một regex là giải pháp tốt nhất cho vấn đề đó. Khi bạn làm việc với một cơ sở dữ liệu quan hệ, dữ liệu thường được cấu trúc trước, vì vậy một regex không phát sáng trong bối cảnh đó.

2

Nếu bạn muốn tìm hiểu về cụm từ thông dụng, tôi khuyên bạn nên Mastering Regular Expressions. Nó đi tất cả các cách từ các khái niệm rất cơ bản, tất cả các con đường lên để nói về cách thức các công cụ khác nhau hoạt động bên dưới. 4 chương cuối cùng cũng đưa ra một chương dành riêng cho mỗi PHP, .Net, Perl và Java. Tôi đã học được rất nhiều từ nó, và vẫn sử dụng nó như là một tài liệu tham khảo.

6

Coolest biểu thức chính quy bao giờ:

/^1?$|^(11+?)\1+$/ 

Nó kiểm tra nếu một số là số nguyên tố. Và nó hoạt động!!

N.B .: để làm cho nó hoạt động, cần thiết lập một chút; số lượng mà chúng tôi muốn kiểm tra phải được chuyển đổi thành một chuỗi các “1” đầu tiên, sau đó chúng ta có thể áp dụng các biểu thức để kiểm tra nếu chuỗi không không chứa một số nguyên tố của “1” s:

def is_prime(n) 
    str = "1" * n 
    return str !~ /^1?$|^(11+?)\1+$/ 
end 

Có giải thích được giải nén và rất dễ tiếp cận tại số Avinash Meetoo’s blog.

+2

Đó là thông minh, nhưng hầu như không thích hợp cho người mới bắt đầu! :) –

+0

Điều đó dường như không hoạt động ... hoặc tôi đang thiếu thứ gì đó. – Copas

+0

@Copas: Nó hoàn toàn hoạt động. Bạn đã đọc hướng dẫn và giải thích mà tôi đã liên kết chưa? –

0

Những của RE là đặc trưng cho Visual Studio và C++ nhưng tôi đã tìm thấy chúng hữu ích vào những thời điểm:

Tìm tất cả các lần xuất hiện của "routineName" với params không mặc định thông qua:

routineName \ (: a + \)

Ngược lại để tìm tất cả các lần xuất hiện của "routineName" chỉ với giá trị mặc định: routineName \ (\)

Để tìm mã được bật (hoặc tắt) trong bản dựng gỡ lỗi:

\ #if. _DEBUG *

Lưu ý rằng điều này sẽ bắt tất cả các biến thể: ifdef, nếu được xác định, ifndef, nếu!định nghĩa

0

Members mật khẩu mạnh:

này ai sẽ xác nhận một mật khẩu có độ dài từ 5 đến 10 ký tự alphanumerical, với ít nhất một chữ hoa, một trường hợp thấp hơn và một chữ số:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$ 
Các vấn đề liên quan