Double Commander

2.14. Cú pháp biểu thức thông thường

nội dung

1. Giới thiệu
2. Đơn giản phù hợp
3. Thoát chuỗi
4. Lớp nhân vật
5. Các ký tự Meta
5.1. Ký tự meta-Dấu phân cách dòng
5.2. meta-character-Các lớp được xác định trước
5.3. meta-characters-biên giới từ
5.4. Các ký tự meta-iterator
5.5. Meta Characters-Các lựa chọn thay thế
5.6. meta-characters-Biểu thức con
5.7. Ký tự Meta-Tham chiếu ngược
6. Prospective & Postlook assert (Dự đoán trước và dự đoán sau)
7. Nhóm không bắt
8. nhóm nguyên tử
9. Danh mục Unicode
10. bộ sửa đổi

Double Commander sử dụngTRegExpr, mộtthư viện miễn phí được viết bởi Andrey Sorokin.

Hầu hết các tập tin trợ giúp giải thích đến từ thư viện đó.

1. Giới thiệu

Regular Expression là một phương pháp được sử dụng rộng rãi để chỉ định một mẫu tìm kiếm văn bản. Các ký tự đặc biệt (meta-characters) cho phép chúng ta chỉ định, ví dụ, một chuỗi cụ thể mà chúng ta đang tìm kiếm xuất hiện ở đầu hoặc cuối một dòng hoặccó chứa n lần xuất hiện của một ký tự hoặc một nhóm ký tự.

Double Commander hỗ trợ các biểu thức chính quy trong các tính năng sau:

Thư viện TRegExp hỗ trợ hai chế độ hoạt động: ANSI và Unicode. Khi tìm kiếm trong một tệp văn bản, Double Commander sử dụng cả hai (tùy thuộc vào mã hóa tệp). Khi tìm kiếm theo tên, sử dụng Unicode.

2.Đơn giản phù hợp

Bất kỳ ký tự riêng lẻ nào cũng khớp với chính nó, trừ khi nó là một siêu ký tự có ý nghĩa đặc biệt được mô tả dưới đây.

Một chuỗi các ký tự khớp với chuỗi đó trong chuỗi mục tiêu, vì vậy lược đồbluhsẽ khớp với chuỗi mục tiêubluh

Chúng ta có thể thực hiện điều này bằng cách thêm dấu gạch chéo ngược vào trước các ký tự meta hoặccác chuỗi thoát\để làm cho chúng được diễn giải theo nguyên văn, ví dụ: các ký tự meta^Bắt đầu chuỗi được khớp, nhưng\^các ký tự khớp^\\tương xứng\Khoan đã.

Dưới đây là một số ví dụ:

Ví dụ trận đấu dễ dàng
Kết quảExpressions
Foobar
Khớp chuỗifoobar
bởi fooBarPtr
so khớp^FooBarPtr

3. Thoát chuỗi

Các ký tự có thể được chỉ định bằng cách sử dụng cú pháp thoát chuỗi tương tự như được sử dụng trong C và Perl:\nKết hợp ngắt dòng,\tSo sánh các tab và nhiều hơn nữa.

Tổng quát hơn, một\xnnTrong số đó,nnlà một chuỗi các số thập lục phân khớp với giá trị ASCII lànncủa nhân vật.

Nếu bạn cần một mã ký tự rộng (Unicode), bạn có thể sử dụng\x{nnnn}Trong số đó,nnnn –Một hoặc nhiều chữ số thập lục phân.

Thoát chuỗi
Kết quảExpressions
\xnn
mã ASCII lànnký tự của
\x{nnnn}
mã ASCII lànnnnCác ký tự (một byte cho văn bản thông thường và hai byte cho Unicode)
\T
Tab (HT/TAB), và\x09tương tự
\n
·Ngắt dòng (NL/LF), với\x0agiống nhau
\R
Trở về ký tự (CR), với\x0dtương tự
\F
Page shapper (FF), với\x0ctương tự
\A
Chuông báo thức (BEL), so với\x07giống nhau
\e
Escape (ESC), với\x1bgiống nhau

Dưới đây là một số ví dụ:

Ví dụ về các chuỗi thoát
Biểu thứckết quả
20bar.
tương xứngfoo bar(Chú ý không gian ở giữa)
\tfoobar
Khớp với các ký tự được xác định trước bởi các ký tự tabfoobar

4. Lớp nhân vật

Bạn có thể làm điều này bằng cách bao quanh một danh sách các ký tự trong[]Medium chỉ định một lớp ký tự, sẽ khớp bất kỳ ký tựnàotrong danh sách.

Nếu như[Nhân vật đầu tiên sau khi^, Sau đó, lớp này khớp với bất kỳ ký tự nàokhôngcó trong danh sách.

Trong danh sách,-Các ký tự được sử dụng để xác địnhmột phạm vi, vì vậya-zbày tỏ từađếnzcủa tất cả các nhân vật, kể cả

Nếu bạn muốn-Bản thân nó trở thành một thành viên của một lớp, đặt nó ở đầu hoặc cuối danh sách hoặc thoát bằng dấu gạch chéo ngược.

Nếu bạn muốn sử dụng]Bạn có thể đặt nó ở đầu danh sách hoặc thoát nó bằng dấu gạch chéo ngược.

Lớp nhân vật
Biểu thứckết quả
[-VN]
tương xứngazhòa-
[VN-]
so khớpazhòa-
[c]
tương xứngazhòa-
[a-c]
Match Từađếnztất cả 26 chữ cái viết thường
[N-\x0D]
So sánh bất kỳ\x10\x11\x12\x13
[\d-c]
khớp với bất kỳ số nào,-hoặct
[]-A]
Match từ]đếnacủa bất kỳ ký tự nào

Dưới đây là một vài ví dụ:

Ví dụ về lớp nhân vật
Kết quảExpressions
[aiou]r
Tìm một Stringfoobarfoobervv, nhưng không bao gồmfoobbrfoobcrChờ đã.
[^aeiou]r
Tìm một Stringfoobbrfoobcrvv, nhưng không bao gồmfoobarfooberChờ đã.

5. Các ký tự Meta

Meta characters là bản chất của regex, các ký tự đặc biệt.

Có nhiều loại meta-character khác nhau, như được mô tả dưới đây.

5.1. Ký tự meta-Dấu phân cách dòng

Một số biểu thức có thể giúp phát hiện sự tách dòng.

Dấu phân cách đường
Kết quảExpressions
^
hành đầu
$
kết thúc hàng
\A
Bắt đầu văn bản
\Z
Kết thúc một văn bản
.
Bất kỳ ký tự trong một dòng

Dưới đây là một vài ví dụ:

Ví dụ về Line Separator
Kết quảExpressions
^foobar
Chỉ khi chuỗifoobarSo khớp ở đầu hàng
$foobar
Chỉ khi chuỗifoobarKết hợp khi kết thúc dòng
^foobar$(tiếng Anh)
Chỉ khi một StringfoobarSo khớp khi là chuỗi duy nhất trong một hàng
thong.r
khớp với hìnhfoobarfoobbrfoob1rChuỗi bằng nhau

Theo mặc định,^Các ký tự meta chỉ được đảm bảo khớp ở đầu chuỗi/văn bản đầu vào,$Các ký tự meta chỉ khớp ở cuối. Các dấu tách dòng được nhúng không bị^hoặc$Khớp.

Tuy nhiên, bạn có thể muốn nghĩ về một chuỗi như một bộ đệm đa dòng để^sẽ khớp sau bất kỳ dấu tách dòng nào bên trong chuỗi,$Nó sẽ khớp trước bất kỳ dấu tách dòng nào. Bạn có thể làm điều đó bằng cách mởmodifier m.

\Ahòa\Zgiống như^hòa$tương tự, nhưng khi sử dụngsửa đổi m, chúng không khớp nhiều lần, trong khi^hòa$Nó sẽ được khớp tại mỗi ngăn cách dòng nội bộ.

Theo mặc định,.Meta characters match any characters, nhưng nếumodifier sđược tắt, sau đó.Các dấu tách dòng nhúng không khớp nhau.

RegExpr xử lý các dấu tách dòng theo tiêu chuẩn kỹ thuật Unicode (tiêu chuẩn kỹ thuật #18):

Xin lưu ý rằng,^.*$(Chế độ dòng trống) sẽ không được sử dụng trong\x0D\x0Achuỗi rỗng được khớp trong một chuỗi, nhưng sẽ có một chuỗi rỗng được tìm thấy trong\x0A\x0DChuỗi rỗng được kết hợp trong một chuỗi.

5.2. meta-characters-Các lớp được xác định trước

Một số biểu thức giúp phát hiện một nhóm ký tự.

Các lớp được định nghĩa trước
Biểu thứckết quả
\w
Các ký tự chữ và số (bao gồm_), đó là[0-9A-Za-z_]
\W
Các ký tự không chữ số
\d
các chữ số
\N
Ký tự không phải là số
\s
Bất kỳ ký tự không gian nào (với[ \t\n\r\f]giống nhau)
\M
các ký tự không phải là dấu cách

Bạn có thể sử dụng nó trongmột lớp nhân vậttùy chỉnh\w\dhòa\s

Dưới đây là một vài ví dụ:

Ví dụ về lớp được định nghĩa trước
Kết quảExpressions
bởi foob\dr
khớp với hìnhfoob1rfoob6rChuỗi bằng nhau, nhưng không bao gồmfoobarfoobbrđợi
c [n]r
khớp với hìnhfoobarfoob rfoobbrChuỗi bằng nhau, nhưng không bao gồmfoob=rđợi

5.3. meta-characters-biên giới từ

Lời bài hát: Word (\b(Bên cạnh đó có\wvà phía bên kia có\Wvị trí giữa hai ký tự (theo một trong hai thứ tự), các ký tự tưởng tượng ở đầu và cuối của chuỗi được tính là khớp\W

Giới hạn từ
Biểu thứckết quả
\b;
Giới hạn từ phù hợp
\C
So khớp các ranh giới không phải từ

5.4. Các ký tự meta-iterator

Bất kỳ mục nào của biểu thức chính quy đều có thể theo một loại iterator meta-character khác.

Với các meta-characters này, bạn có thể chỉ định số lần xuất hiện của các ký tự trước đó, meta-characters hoặc các biểu thức phụ.

Bộ lặp
Kết quảExpressions
*
Số không hoặc nhiều lần ("tham lam"), tương tự như{0,}
+
Một lần hoặc nhiều lần ("tham lam"), tương tự như{1,}
?
0 lần hoặc một lần ("tham lam"), tương tự như{0,1}
{{n}
vừa lúcnLời bài hát: The Greed (feat.
{n,}
ít nhất/ít nhấtnLời bài hát: The Greed (feat.
{n,m}
ít nhất/ít nhấtnlần nhưng không vượt quamLời bài hát: The Greed (feat.
*?
0 lần hoặc nhiều lần ("không tham lam"), tương tự như{0,}?
+?
Một lần hoặc nhiều lần ("không tham lam"), tương tự như{1,}?
??
0 lần hoặc một lần ("không tham lam"), tương tự như{0,1}?
{{n}?
vừa lúcnLần ("Không tham lam")
{n,}?
ít nhấtnLời bài hát: Not Greed (Live)
{n,m}?
ít nhất/ít nhấtnlần nhưng không quámLời bài hát: Not Greed (Live)

Do đó hình thức là{n,m}Các số trong dấu ngoặc nhọn chỉ định số lầntối thiểucác mục được khớpnvà thời giantối đam

hình thức{n}tương đương với{n,n}vừa khớpnlần.

hình thức{n,}so khớpnthời gian hoặc hơn.

nhoặcmKhông có giới hạn về kích thước, nhưng số lượng lớn có thể làm chậm việc thực hiện và tiêu thụ nhiều bộ nhớ hơn.

Nếu dấu ngoặc nhọn xuất hiện trong bất kỳ ngữ cảnh nào khác, nó được coi là một ký tự bình thường.

Dưới đây là một vài ví dụ:

Ví dụ về iterator
Biểu thứckết quả
foob.* R
khớp với hìnhfoobarfoobalkjdflkj9rhòafoobrChuỗi bằng nhau
Foob.+ R
khớp với hìnhfoobarfoobalkjdflkj9rChuỗi bằng nhau, nhưng không bao gồmfoobr
foob.? R
tương xứng nhưfoobarfoobbrhòafoobrChuỗi bằng nhau nhưng không bao gồmfoobalkj9r
Fooba{2}R
Khớp chuỗifoobaar
fooba{2,}r {\displaystyle {2,}r}
khớp với hìnhfoobaarfoobaaarfoobaaaarChuỗi bằng nhau
Fooba{2, 3}r
khớp với hìnhfoobaarhoặcfoobaaarChuỗi bằng nhau nhưng không bao gồmfoobaaaar

Một lời giải thích nhỏ về "tham lam".

"Tham lam" lấy càng nhiều càng tốt,"không tham lam" lấy càng ít càng tốt.

Ví dụ,b+hòab*Áp dụng đối với chuỗiabbbbctrở về/trở vềbbbbb+?quay vềbb*?Trả về một chuỗi rỗng,b{2,3}?trở về/trở vềbbb{2,3}trở về/trở vềbbb

Bạn có thể chuyển tất cả các iterators sang chế độ "không tham lam"(xemmodifier g).

5.5. Meta Characters-lựa chọn thay thế

Bạn có thể sử dụng|Phân tách một loạtcác lựa chọn thay thế để chỉ định một mẫu, vì vậyfee|fie|foesẽ khớp với chuỗi mục tiêufeefiehoặcfoef(e|i|o)ecũng như vậy).

Phương án 1: Sử dụng phương án 1 (([hoặc bắt đầu mô hình) đến đầu tiên|của tất cả các nội dung, thay thế cuối cùng chứa từ cuối cùng|Tất cả thông tin về the next pattern separator

Vì vậy, nó thường được thực hành để đặt các lựa chọn thay thế trong dấu ngoặc đơn để giảm thiểu sự nhầm lẫn về nơi họ bắt đầu và kết thúc.

Các lựa chọn thay thế được thử từ trái sang phải, vì vậy lựa chọn đầu tiên được tìm thấy để khớp toàn bộ biểu thức sẽ được chọn.

Điều đó có nghĩa là sự thay thế không nhất thiết phải tham lam.

Ví dụ: Khi sử dụngfoo|footso khớpbarefootkhi, chỉ cófooCác phần sẽ khớp vì đây là sự thay thế cho lần thử đầu tiên và nó khớp thành công chuỗi mục tiêu. (Điều này có thể không quan trọng khi chúng tôi sử dụng dấu ngoặc để nắm bắt văn bản phù hợp.)

Cũng hãy nhớ rằng,|được giải thích theo nghĩa đen trong ngoặc vuông, vì vậy nếu bạn viết[fee|fie|foe]Trên thực tế, nó chỉ phù hợp[feio|]

Ví dụ về:

Ví dụ về lựa chọn thay thế
Kết quảExpressions
foo(bar| FOO)
Khớp chuỗifoobarhoặcfoofoo

5.6. meta-characters-Biểu thức con

Cấu trúc ngoặc đơn( ... )Nó cũng có thể được sử dụng để định nghĩa các biểu thức con regex.

Sau khi tìm kiếm, bạn có thể gọi bất kỳ biểu thức con nào và bạn có thể sử dụng biểu thức con làm mặt nạ.

Các biểu thức con được đánh số theo thứ tự từ trái sang phải dựa trên dấu ngoặc đơn mở của chúng.

Biểu thức con đầu tiên được đánh số 1 và hỗ trợ tối đa 90 biểu thức con (toàn bộ khớp regex được đánh số 0 bạn có thể thay thế bằng$0hoặc$&)。

Dưới đây là một vài ví dụ:

Biểu thức con
Biểu thứckết quả
(đổi hướng từ Foobar)
Trận đấu bao gồm 8, 9 hoặc 10foobarString của Instance
Foob([0-9])(Tiếng Việt)| c +)
tương xứngfoob0rfoob1rfoobarfoobaarfoobaarđợi

Lưu ý về mẫu Thay thế bằng:

Ví dụ về:

Chúng ta hãy lấy ngày21.01.2018lộn ngược thành2018.01.21
Tìm Kiếm:(\d{2})\.(\d{2})\.(\d{4})
Thay thế với:$3.$2.$1

5.7. Ký tự Meta-Tham chiếu ngược

Các ký tự Meta\1đến\9Được hiểu như một trích dẫn ngược.\nSo khớp các biểu thức con đã khớp trước đón

Dưới đây là một vài ví dụ:

Ví dụ về Backlinks
Kết quảExpressions
(.)\ 1+
tương xứngaaaahòacc
(.+)\ 1+
cũng tương xứngababhòa123123
(['"]?) (\c +)\1
tương xứng"13"(Trong dấu ngoặc kép),'4'(trong dấu ngoặc đơn) hoặc77(Không có dấu ngoặc kép) vv

6. Prospective & Postlook assert (Dự đoán trước và dự đoán sau)

Prospective khẳng định:foo(?=bar)chỉ khibartrận đấu trướcfoo, vàbarKhông được bao gồm trong trận đấu

Dự đoán tiêu cực về phía trước:foo(?!bar)chỉ ở phía sau mà không theobarThời gian phù hợpfoo

Tích cực nhìn lại khẳng định:(?<=foo)barchỉ khifooSau trận đấubar, vàfooKhông được bao gồm trong trận đấu

Dự đoán ngược tiêu cực:(?<!foo)barchỉ ở phía trước không cófooKhớp khi tiền tốbar

Giới hạn:

7. Nhóm không bắt

Ngữ pháp:(?:expr)

Các nhóm như vậy không có "chỉ mục" và không hiển thị cho các tham chiếu ngược. Nhóm không bắt được sử dụng khi chúng ta muốn nhóm các biểu thức cặp nhưng không muốn lưu chúng dưới dạng phần khớp/bắt của chuỗi. Sử dụng nhóm không bắt giữ có thể tăng tốc độ làm việc của biểu thức chính quy.

Nhóm không bị bắt
Kết quảExpressions
(HTTPS?| FTP)://([^/\r\n]+)
Trong khihttps://doublecmd.sourceforge.ioTrận đấu giữahttpshòadoublecmd.sourceforge.io
(?: https?| FTP)://([^/\r\n]+)
Trong khihttps://doublecmd.sourceforge.ioTrung bình chỉ phù hợpdoublecmd.sourceforge.io

8. nhóm nguyên tử

Ngữ pháp:(?>expr|expr|...)

Các nhóm nguyên tử là trường hợp đặc biệt cho các nhóm không bị bắt: nếu một phần của mẫu đã được tìm thấy, nhóm này sẽ vô hiệu hóa backtrack cho nhóm dấu ngoặc đơn. Các nhóm nguyên tử hoạt động nhanh hơn và hữu ích để tối ưu hóa các nhóm với nhiều biểu thức khác nhau.

Ví dụ,a(bc|b)ctương xứngabcchòaabca(?>bc|b)cso khớpabccNhưng không khớpabc, bởi vì động cơ bị cấm quay trở lại và cố gắng thiết lập nhóm nhưb

9. Danh mục Unicode

Tiêu chuẩn Unicode đặt tên cho các lớp nhân vật.Đây là những chuỗi 2 chữ cái. thí dụLulà chữ in hoa,LlĐó là chữ thường. và nhóm lớn 1 chữ cáiLlà tất cả các chữ cái.

Danh mục Unicode
Thể loạiSự miêu tả
chữ
L
Lu
chữ hoa
Ll
chữ thường
Lt
Tiêu đề chữ hoa và chữ thường
Bảng chữ cái sửa đổi
Lm
Lo Các
chữ cái khác
Đánh dấu
M
Mn
không dấu khoảng cách
Mc đánh
dấu kết hợp sân
Thẻ đóng
của tôi
Số
N
Số thập phân
Nd
Nl
chữ và số
No
Số khác
P-Chấm
câu
Dấu chấm câu kết nối
Pc
Pd
dấu chấm câu gạch nối
Điểm mở thầu
của Ps
Pe
dấu câu đóng
Pi
Dấu câu ban đầu
Dấu chấm câu cuối của
Pf
Po
Các dấu chấm khác
S
Biểu tượng
Sm
Biểu tượng toán học
Sc
Biểu tượng tiền tệ
Biểu tượng sửa đổi
Sk
So Các
biểu tượng khác
Dấu phân cách
Z
Dấu cách
Zs
Bộ chia dòng
Zl
Phân cách đoạn văn
Zp
C.
Khác
Cc
kiểm soát
Định dạng
Cf
Đại lý
Cs
Co
Sử dụng riêng
Cn
chưa phân phối

Các ký tự Meta\pMột ký tự Unicode thể hiện một thể loại cụ thể. Ngữ pháp:\pLhòa\p{L}cho tên 1 chữ,\p{Lu}Dùng cho tên 2 chữ cái.

ký tự meta\PLà ngược lại, nó đại diện cho một ký tự Unicode không nằm trong một lớp được chỉ định.

Các meta-characters này cũng được hỗ trợ trong các lớp nhân vật.

10. bộ sửa đổi

Cú pháp cho sửa đổi đơn:(?i)có nghĩa là mở,(?-i)Có nghĩa là đóng cửa. Cho phép nhiều modifier như:(?msgxr-imsgxr)

Modifier được sử dụng để thay đổi hành vi của các biểu thức chính quy. Modifier chỉ ảnh hưởng đến(?imsgxr-imsgxr)Phần Regular Expression theo sau toán tử.

Bất kỳ sửa đổi nào trong số này có thể được nhúng vào chính biểu thức chính quy. Nếu modifier nằm trong một subexpression, nó chỉ ảnh hưởng đến subexpression đó.

i
Thực hiện khớp mẫu không phân biệt chữ hoa chữ thường (sử dụng cài đặt khu vực được cài đặt trong hệ thống của bạn).Đóng theo mặc định.
m
Hãy suy nghĩ về một chuỗi như nhiều hơn một dòng.Đó là, đưa^hòa$Thay đổi từ đầu hoặc cuối của chuỗi chỉ khớp thành đầu hoặc cuối của bất kỳ hàng nào trong chuỗi khớp, xem thêmdấu tách dòng.Đóng theo mặc định.
s
Hãy suy nghĩ về chuỗi như một dòng duy nhất. Cụ thể, sẽ.Thay đổi để khớp với bất kỳ ký tự nào, ngay cả dấu tách dòng (xem thêmdấu tách dòng), trong khi nó thường không khớp. Mở theo mặc định.
g
Sửa đổi không chuẩn.Đóng nó sẽ chuyển tất cả các toán tử tiếp theo sang chế độ không tham lam (bộ sửa đổi này được bật theo mặc định). Vì vậy, nếu modifiergđóng cửa, sau đó+làm việc theo cách+?*làm việc theo cách*?Chờ đã.
x
Mở rộng khả năng đọc của chế độ bằng cách cho phép khoảng trắng và nhận xét (xem hướng dẫn bên dưới).Đóng theo mặc định.
R
Sửa đổi không chuẩn. Nếu được thiết lập, một dãyа-яBao gồm thêm bảng chữ cái tiếng NgaёА-ЯBổ sung bao gồmЁа-ЯBao gồm tất cả các chữ cái tiếng Nga. Mở theo mặc định.
#
(?# text): Bình luận,textBị phớt lờ. Lưu ý rằng TRegExpr đang xem)khi đóng ghi chú, vì vậy bạn không thể đặt văn bản trong ghi chú)

Dưới đây là một vài ví dụ:

Ví dụ về phần mở rộng Perl
Biểu thứckết quả
(? Thảo luận: Saint-Petersburg
tương xứngSaint-petersburghòaSaint-Petersburg
(? c) Saint-(?- c)Petersburg
tương xứngSaint-PetersburgNhưng không khớpSaint-petersburg
(? i)(Saint-)? Petersburg
tương xứngSaint-petersburghòasaint-petersburg
((? Tôi)Saint-)? Petersburg.
tương xứngsaint-PetersburgNhưng không khớpsaint-petersburg

bộ sửa đổixBản thân nó cần được giải thích thêm.

Nó cho biết để bỏ qua các không gian không có dấu gạch chéo ngược cũng không phải trong các lớp ký tự.

Bạn có thể sử dụng nó để phá vỡ các biểu thức chính quy thành các phần (hơi) dễ đọc hơn.

#Ký tự cũng được coi là siêu ký tự để giới thiệu nhận xét, chẳng hạn như:

(
  (abc) # 注释1
    |   # 您可以使用空格来格式化正则表达式 - TRegExpr会忽略它
  (efg) # 注释2
)

Nó cũng có nghĩa là nếu bạn muốn sử dụng không gian thực trong chế độ hoặc#Các ký tự (ngoài các lớp ký tự, chúng không bị ảnh hưởng bởixTác động), bạn phải thoát khỏi chúng hoặc mã hóa bằng cách sử dụng lối thoát bát phân hoặc thập lục phân.

Nhìn chung, các tính năng này cải thiện đáng kể khả năng đọc văn bản regex.


有效的HTML 4.0过渡 CSS有效!