趣味新聞網 logo



Regular Expression (正規錶示式 簡寫 regexp或regex)是一個字串 Regular Expression 新手入門 - 趣味新聞網


Regular Expression (正規錶示式 簡寫 regexp或regex)是一個字串 Regular Expression 新手入門


發表日期 2008-05-14T01:00:25+08:00



     趣味新聞網記者特別報導 : Regular Expression (正規錶示式,簡寫 regexp或regex)是一個字串,可用來描述字串的模式,例如我要錶達「兩個英文大寫字母」,那麼 regexp 就是 [A-Z]{2}。而使 .....


     Regular Expression (正規錶示式,簡寫 regexp或regex)
是一個字串,可用來描述字串的模式,
例如我要錶達「兩個英文大寫字母」,那麼 regexp 就是 [A-Z]{2}。
而使用這個 regexp ,就可以在一個字串內找齣配閤 (Match) 的部份,
例如在字串 $st = '11AA22BB33' 內,有哪些部份配閤「兩個英文大寫字母」這個模式?
就會找到 'AA' 和 'BB' 兩部份瞭。

以下是一些常見的 regexp 應用:

use strict;
my ($st, $pattern, $replacement, @array, @matches);

##
## 有沒有找到至少一個 Match?
##
$st = '11AA22';
$pattern = 'AA';

if ($st =~ /$pattern/) {
print "has at least one match ";
} else {
print "no match ";
}


##
## 找齣所有 Matches
##
$st = '11AA22BB33';
$pattern = '[A-Z]{2}';

@matches = $st =~ /$pattern/g;

foreach my $i (0 .. $#matches) {
print "$i : $matches[$i] ";
}


##
## 找齣所有 Matches,並取代它們
##
$st = '11AA22AA33';
$pattern = 'AA';
$replacement = 'XX';

$st =~ s/$pattern/$replacement/g;

print "$st ";


##
## 在 Matches 的位置分割
##
$st = '11AA22AA33';
$pattern = 'AA';

@array = split /$pattern/, $st;

print join ',', @array;



以下是 .Net 例子(以 C# 語言)

using System;
using System.Text.RegularExpressions;

class MainClass
{
public static void Main(string[] args)
{
string st, pattern, replacement;
string[] array;
MatchCollection mc;

//
// has at least one match?
//
st = "11AA22";
pattern = @"AA";

if ( Regex.IsMatch(st, pattern) ) {
Console.WriteLine("has at least one match");
} else {
Console.WriteLine("no match");
}

//
// get all matches
//
st = "11AA22BB33";
pattern = @"[A-Z]{2}";

mc = Regex.Matches(st, pattern);

for (int i = 0; i < mc.Count; i++ )
{
Console.WriteLine("{0} : {1}", i, mc );
}
//
// search and replace
//
st = "11AA22AA33"; pattern = @"AA"; replacement = "XX";
st = Regex.Replace(st, pattern, replacement);
Console.WriteLine("{0}", st);
//
// split
//
st = "11AA22AA33"; pattern = "AA";
array = Regex.Split(st, pattern);
Console.WriteLine(String.Join(",", array));
}
}


[[解釋 regexp 的意思]]
當您遇到一些很難看得懂的 regexp, 您可以用 YAPE::Regex::Explain 模組, 把 regexp 翻譯成英文,這對新手來說有很大幫助。

#### use YAPE::Regex::Explain;
my $pattern = '[A-Z]{2}';
print YAPE::Regex::Explain->new($pattern)->explain;
####

輸齣結果:
[A-Z]{2} any character of: 'A' to 'Z' (2 times)
意思是「任何一個由 'A' 至 'Z' 的字元(兩次)」,
那麼它配閤的東西就是:
AA
AB
...
AZ
BA
BB
...
ZA
ZB
...
ZZ
------------------------------------------------------------------------------------------------

>我目前所碰到的瓶頸是
>有沒有可能使用Regular Expression來判斷輸入的是數字,並且限定其數值範圍0.0

參考 perlretut 內的 "Building a regexp" 一節

------------------------------------------------------------------------------------------------

[[ 特殊字元 (Metacharacter) ]]

當您要錶示一些特殊字元,例如括號,那就不能直接寫:
$pattern = '(';

而要在前麵加上反斜號:
$pattern = '(';

以下 regexp 的特殊字元:

{}[]()^$.|*+?/

為什麼這些是特殊字元呢?本文稍後會介紹。

例:
####
$st = '11((22';
$pattern = '((';

@matches = $st =~ /$pattern/g;

foreach my $i (0 .. $#matches) {
print "$i : $matches[$i] ";
}
####

順帶一提,應盡量用單引號來括字串,
因為它不會好像雙引號那樣會做字串插入,如果寫:
$pattern = "((";

那結果變成:
$pattern = '((';

------------------------------------------------------------------------------------------------

[[ 脫離序列 (Escape Sequence) ]]

當您要錶示 tab、 newline 等不能列印的字元,
可以用 Escape Sequence。

例:
$st = "11 22 33";
$pattern = ' ';

------------------------------------------------------------------------------------------------

[[ 字元類彆 (Character Class) ]]

您除瞭可以錶示一個固定的字元外,如
$pattern = 'A';

還可以錶示一個字元集閤,例如您想錶示
「'A'字元或者'B'字元或者'C'字元」,可以寫
$pattern = '[ABC]';

即把您想 match 的字元寫在中括號內。

例:
$st = '11A22B33C44D';
$pattern = '[ABC]';

會找到以下的 match:
0 : A
1 : B
2 : C

例如您想找 'AAAXX' 或者 'AABXX' 或者 'AACXX':

$st = '11AACXX22AABXX33AAAXX44AAD';
$pattern = 'AA[ABC]XX';

會找到以下的 match:

0 : AACXX
1 : AABXX
2 : AAAXX

留意一點,雖然 $pattern 內的 [ABC] 是先寫A,
但結果是先找到 'AACXX',而不是'AAAXX',
因為 Perl 是先從 $st 的左邊開始找,而不是先從右邊開始找,
而 'AACXX' 是最左邊的 match。

------------------------------------------------------------------------------------------------

[[ 字元類彆 - 脫離序列 ]]

在字元類彆內錶示一些特殊字元,也是要加反斜號,
不過字元類彆內的特殊字元是:
-]^$


本文稍後會解釋為何它們是特殊字元。

例:
$st = '11A22B33-44]';
$pattern = '[AB-]]';

會找到以下的 match:
0 : A
1 : B
2 : -
3 : ]

------------------------------------------------------------------------------------------------

[[ 字元類彆 - 範圍運算子 (Range Operator) ]]

您可以用減號,來錶示一段字元範圍,例如
$pattern = '[ABCDEFGHIJ]';

可以寫成
$pattern = '[A-J]';

這樣就更簡潔瞭。又例如
$pattern = '[ABCDKLMN0123]';

可以寫成
$pattern = '[A-DK-N0-3]';

但如果把減號寫在最頭或者最尾,例如
$pattern = '[-AB]';

$pattern = '[AB-]';

那麼減號就直接錶示 '-' 字元,而不是範圍運算子瞭。

例:
$st = '99A88L773]';
$pattern = '[A-DK-N0-3]';

會找到以下的 match:
0 : A
1 : L
2 : 3


------------------------------------------------------------------------------------------------

[[ 字元類彆 - 反相字元類彆 (Negated Character Class) ]]

例如要錶示「'A'或者'B'或者'C'」,就寫
$pattern = '[ABC]';

但如果要錶示「'A'或者'B'或者'C'」的相反,即「不是'A'並且不是'B'並且不是'C'」
就可以寫
$pattern = '[^ABC]';

在字元類彆內,如果第一個字元是 '^',就錶示這是一個「反相字元類彆」。

例:
$st = '11A22B33X44Y';
$pattern = '[^A-C0-9]';

會找到以下的 match:
0 : X
1 : Y

------------------------------------------------------------------------------------------------

[[ 字元類彆 - 簡寫 ]]

Perl 提供瞭一些常用的字元類彆簡寫,例如
$pattern = '[0-9]';

其實可以寫成
$pattern = 'd';

這就更簡潔瞭。以下列齣這些簡寫:

d 等於寫 [0-9]
D 等於寫 [^0-9] ,即 d 的相反
w 等於寫 [0-9a-zA-Z_] ,即數字、英文大小寫字母和底綫
W 等於寫 [^0-9a-zA-Z_] ,即 w 的相反
s 等於寫 [ f] ,即白格字元 (Whitespace character),
包括space, tab, newline, carriage return, form feed

S 等於寫 [^ f] ,即 s 的相反

還有一個很特彆的簡寫,就是點號 '.',
因為它比較復雜,所以稍後再介紹它。

例:
$st = '11A22b33_44=';
$pattern = 'D';

會找到以下的 match:
0 : A
1 : b
2 : _
3 : =


例:
$st = '11AA22A_33A044AX';
$pattern = 'A[^dX-Z]';

會找到以下的 match:
0 : AA
1 : A_

------------------------------------------------------------------------------------------------

[[ Alternation ]]

如果想錶示「'AB'字串或'KLM'字串或者'PQRST'」,可以寫
$pattern = 'AB|KLM|PQRST';
即用直綫分隔它們。

Alternation 跟 Character Class 很像,
例如以下兩者是一樣的:

$pattern = '[ABC]';
$pattern = 'A|B|C';

不過 Character Class 不能錶示超過一個字元的字串。

例:
$st = '11AB22KLMN33PQRS';
$pattern = 'AB|KLM|PQRST';

會找到以下的 match:
0 : AB
1 : KLM

如果寫:
$pattern = 'PQRST|KLM|AB';

那還是會先找到 'AB',效果跟 Character Class 一樣。

------------------------------------------------------------------------------------------------

[[群組 (Group)]]

如果想錶示「'ABC'或者'ABKL'或者'ABPQR'」,除瞭可以寫:
$pattern = 'ABC|ABKL|ABPQR';

還可以這樣寫:
$pattern = 'AB(C|KL|PQR)';

即用括號來分開'AB'和接著的那三個 Alternatives,
好像數學上把 2*3 + 2*4 + 2*5 寫成 2 * (3+4+5)。

如果想連'AB'都要 match:
$pattern = 'AB|ABC|ABKL|ABPQR';

也可以把空字串都寫到括號內:
$pattern = 'AB(C|KL|PQR|)';

------------------------------------------------------------------------------------------------

[[群組 - 特殊變數 $1, $2, ...]]

括號還有一種特彆的功能,就是把括號內 match 到的部份
放到特殊變數 $1, $2, ...。

例如您想檢查某字串是含有時間的模式,例如 HH:MM:SS,
(不檢查數值範圍),同時想取得時分秒各個部份,可以寫:

####
my ($time_string, $hour, $minute, $second);

$time_string = '12:34:56';
$pattern = '(dd):(dd):(dd)';

if ($time_string =~ /$pattern/) {
($hour, $minute, $second) = ($1, $2, $3);
print "hour=$hour,minute=$minute,second=$second";
} else {
print 'Invalid time format';
}

####

執行結果:
hour=12,minute=34,second=56


至於哪部份是 $1, $2, ...,就以開括號齣現的先後順序來決定,
例如括著「時」那個開括號是第一個齣現的,所以它就對應 $1。

(dd):(dd):(dd)
1______2______3

------------------------------------------------------------------------------------------------

[[群組 - 巢狀群組]]

括號內也可以有括號,成為巢狀群組,例如:

(dd):((dd):(dd))
1______23______4

####
my ($time_string, $hour, $minute, $second);

$time_string = '12:34:56';
$pattern = '(dd):((dd):(dd))';

if ($time_string =~ /$pattern/) {
print "$1=$1 $2=$2 $3=$3 $4=$4";
} else {
print 'Invalid time format';
}
####

執行結果:
$1=12
$2=34:56
$3=34
$4=56

------------------------------------------------------------------------------------------------

[[群組 - 返迴參照 (Backreferences) 1, 2, ...]]


跟 $1, $2, ... 有很密切關係的東西,就是 Backreferences,
即 1, 2, ... 。

它們不同之處,在於 $1 隻應該用在 regexp 「以外」,
而 1 隻應該用在 regexp 「以內」。

例:
####
$st = 'A_A';
$pattern = '([ABC])_1';

if ($st =~ /$pattern/) {
print "$1=$1";
}
####

執行結果:
$1=A


您可以嘗試把 $st 改成:
$st = 'B_B';
$st = 'C_C';

您會發現 1 能夠取得之前所 match 的東西,
即應該放到 $1 的值。但要緊記,不應該在 regexp 以內寫 $1。


例:
####
$st = 'ALZ_A_L_Z';
$pattern = '([ABC])([KLM])([XYZ])_1_2_3';

if ($st =~ /$pattern/) {
print "$1=$1 $2=$2 $3=$3";
}
####

執行結果:
$1=A
$2=L
$3=Z

------------------------------------------------------------------------------------------------

[[ 群組 - $1, $2, ... 的開始和結束位置 ]]

Perl 5.6.0 提供瞭兩個陣列 @- 和 @+,
@- 儲存瞭 $1, $2, ... 的開始位置,@+ 就儲存結束位置。

例:
####
my ($time_string, $hour, $minute, $second);

$time_string = '12:34:56';
$pattern = '(dd):(dd):(dd)';

$time_string =~ /$pattern/;

foreach my $i (1 .. $#-) {
print "Match $i='${$i}' at position ($-[$i] , $+[$i]) ";
}
####

執行結果:
Match 1='12' at position (0 , 2)
Match 2='34' at position (3 , 5)
Match 3='56' at position (6 , 8)

------------------------------------------------------------------------------------------------

[[ 群組 - $` 、 $& 和 $' ]]

如果 regexp 沒有寫括號,就沒有 $1, $2, ... 可用瞭,
但您仍然可以用 $& 來取得 match,$` 則取得 match 前麵所有東西,
$' 取得 match 後麵所有東西。


####
$st = '11AA22';
$pattern = 'AA';

$st =~ /$pattern/;

print "$`=$` $&=$& $'=$'";
####

執行結果:
$`=11
$&=AA
$'=22


如果用 substr 來錶示,那麼:

$` 是 substr( $st, 0, $-[0] )
$& 是 substr( $st, $-[0], $+[0] - $-[0] )
$' 是 substr( $st, $+[0] )

------------------------------------------------------------------------------------------------

[[ 重覆 (Repetition) ]]

如果想錶示「五個 'A' 字元」,可以寫
$pattern = 'AAAAA';

也可以用量化詞 (Quantifier) ,寫成
$pattern = 'A{5}';

這樣就更清楚瞭。而量化詞可以寫在字元、字元類彆或群組的後麵。

例:
$st = '11AAA22AAAAA';
$pattern = 'A{5}';

------------------------------------------------------------------------------------------------

[[重覆 - 最多和最少]]

量化詞可分成兩類:
1) 最多配對(貪心的) Maximal Match (Greedy)
2) 最少配對(不貪心的) Minimal Match (Non-greedy)


以下列齣「最多配對」:

A? 錶示 0 個或 1 個 'A' 字元(以最多為準)
A* 錶示 0 個或以上的 'A' 字元(以最多為準)
A+ 錶示 1 個或以上的 'A' 字元(以最多為準)

A{n} 錶示 n 個 'A' 字元
A{n,m} 錶示最少 n 個,最多 m 個 'A' 字元(以最多為準)
A{n,} 錶示最少 n 個 'A' 字元(以最多為準)

以下列齣「最少配對」:

A?? 錶示 0 個或 1 個 'A' 字元(以最少為準)
A*? 錶示 0 個或以上的 'A' 字元(以最少為準)
A+? 錶示 1 個或以上的 'A' 字元(以最少為準)

A{n}? 錶示 n 個 'A' 字元
(這個其實沒有所謂的「最多」還是「最少」之分,
定義這個符號隻是為瞭保持符號一緻性而己)
A{n, m}? 錶示最少 n 個,最多 m 個 'A' 字元(以最少為準)
A{n,}? 錶示最少 n 個 'A' 字元(以最少為準)


到底「最多配對」和「最少配對」有什麼分彆呢?例如

$st = 'AAAAA';
$pattern1 = 'A{3,5}'; # 最多配對
$pattern2 = 'A{3,5}?'; # 最少配對

那麼 match 可能是:
1) 'AAA'(字元位置0至2)
2) 'AAAA'(字元位置0至3)
3) 'AAAAA'(字元位置0至4)

如果是「最多配對」,那麼 match 就是 'AAAAA',因為它是最多次數,
如果是「最少配對」,那麼 match 就是 'AAA',因為它是最少次數。

------------------------------------------------------------------------------------------------

[[ 特點字元 - 任何一個字元 ]]

如果要錶示「任何一個字元」,可以用點號 '.'。

在預設的情況下,它會配到「任何一個字元,除瞭 " " 之外」:

$st = "123ABC_!@ ";
$pattern = '.';

@matches = $st =~ /$pattern/g;

如果要配到「任何一個字元,包括 " "」,
就到加入 s 這個「修飾詞」(Modifier):

@matches = $st =~ /$pattern/sg;

s 的意思是「把字串當作單行 (Single Line)」。

------------------------------------------------------------------------------------------------

[[ 字串的開頭 ]]

如果要錶示「字串的開頭」,可以用 '^',例如:

$st = 'AA22';
$pattern = '^AA';

@matches = $st =~ /$pattern/g;


執行結果:
0 : AA


但 match 當中不會有 '^' 所配齣來的字元,
因為 '^' 主要用來測試字串的特性(例如字串位置),
而不是配任何字元的。

為瞭方便理解,您可以把它「想像」成一個看得見的字元,
例如:

$st = '頭AA22尾'; ## $st = 'AA22'
$pattern = '頭AA'; ## $pattern = '^AA';

------------------------------------------------------------------------------------------------

[[ 字串的結尾 ]]

如果要錶示「字串的結尾,或者在字串最尾的 和前麵字元的中間」,
可以用 '$',例如:

$st = "AA BB "; ## 用瞭雙引號
$pattern = '$';

@matches = $st =~ /$pattern/g;

結果有兩個 match ,但是'$' 與 '^' 一樣,是不會配到字元的。
您可以把它想像成:

$st = "頭AA BB尾 尾"; ## $st = "AA BB ";
$pattern = '尾'; ## $pattern = '$';

另外,當檢查一個字串是否符閤某種格式時,
通常會 '^' 和 '$' 一起用,
例如檢查某字串是否符閤「三位數字」的格式:

####
$st = "123";
$pattern = '^d{3}$';

if ($st =~ /$pattern/) {
print "Valid format";
} else {
print "Invalid format";
}
####

------------------------------------------------------------------------------------------------

[[ 多行 (Multi-line) ]]

一個字串內可以含有 ,例如:

$st = "AA AA AA ";
$pattern = '^AA';

如果我們想 '^' 配到每一行的開頭,
可以用 m 修飾詞:

@matches = $st =~ /$pattern/mg;

執行結果:
0 : AA
1 : AA
2 : AA


想像成:

$st = "頭AA尾 頭AA尾 頭AA尾 尾";
$pattern = '頭AA';


用瞭 m 修飾詞,也會令 '$' 配到每一行的結尾,


$st = "AA AA AA ";
$pattern = 'AA$';
@matches = $st =~ /$pattern/mg;


想像成:

$st = "頭AA尾 頭AA尾 頭AA尾 尾";
$pattern = 'AA尾';

如果用瞭 m 修飾詞,您仍然可以用:

A 錶示沒有 m 修飾詞的 '^' 意思
 錶示沒有 m 修飾詞的 '$' 意思
z 代錶字串的結尾(即  ,但不包括最尾 和前麵字元的中間)


$st = "AA AA AA ";
$pattern1 = 'AAA';
$pattern2 = 'AA';
$pattern3 = 'AAz';


總括來說,s 修飾詞會影響 '.' 的意思,
m 修飾詞會影響 '^' 和 '$' 的意思,
s 和 m 總共有四種可能:

沒有 s 和 m :預設模式 (Default Mode)
/s :單行模式 (Single Line Mode)
/m :多行模式 (Multi-Line Mode)
/sm :清楚多行模式 (Clean Multi-Line Mode)


看看大傢能否解釋以下程式的執行結果:

####
$st = "A A A ";
$pattern = '(^|$|.)';

@matches = $st =~ /$pattern/smg;
####

------------------------------------------------------------------------------------------------

[[ 字的邊界 Word Boundary ]]

字的邊界是指兩個連續字元的中間,
一個會配到 w,而另一個會配到 W。
(字串的開頭和結尾也視為配到 W)

例如:

$st = 'ABC-=+';
$pattern = 'C';

@matches = $st =~ /$pattern/g;

因為左邊的 'C' 會配到 w,而右邊的 '-' 會配到 W,
所以  會配到它們的中間。

 不代錶某個字元,而是代錶某個位置的特性。
您可以想像成:

$st = '界ABC界-=+';
$pattern = 'C界';

您可以用 B 來錶示  的相反,即「不是邊界」,

例如:

$st = 'ABCDE';
$pattern = 'BCB';

@matches = $st =~ /$pattern/g;

因為 'C' 本身配到 w ,而它左邊的'B'和右邊的'D'也是配到 w,
所以沒有邊界。

------------------------------------------------------------------------------------------------

[[ 不分大小寫 (Case-insensitive) ]]

如果加入瞭 i 修飾詞,就會做不分大小寫的配對,
例如:

$st = '11AA22BB';
$pattern = '[abAB]';

@matches = $st =~ /$pattern/g;

可以用 i 修飾詞寫成:

$st = '11AA22BB';
$pattern = '[AB]'; # 或者 '[ab]'

@matches = $st =~ /$pattern/ig;

因為不分大小寫,所以不必在 $pattern 把大小寫都列齣來瞭。

------------------------------------------------------------------------------------------------

[[ x 修飾詞 ]]

如果用瞭 x 修飾詞,就會令 regexp 解譯器忽略 $pattern 內的白格,
(除瞭那些在被反斜號標示瞭的白格,及那些在字元類彆內的白格)
還有在 $pattern 內的 '#' 也會有好像 Perl 一樣的單行註解作用,
(除瞭那些在被反斜號標示瞭的'#',及那些在字元類彆內的'#')

它的用途是讓您可以把 regexp 寫成容易閱讀的方式,及加入註解。
例子:


不用 x 修飾詞的寫法:

$st = '11AA22 33\\44##';
$pattern = '(A| |\\|#)';
@matches = $st =~ /$pattern/g;


用瞭 x 修飾詞的寫法:

$st = '11AA22 33\\44##';

$pattern = q{

( # 左括號錶示 Alternation 開始
A # 'A' 字元
| # 或者
[ ] # 用字元類彆錶示空格
| # 或者
\\ # 反斜號字元
|
[#] # 用字元類彆錶示'#'
) # 右括號錶示完結

};

@matches = $st =~ /$pattern/xg;

------------------------------------------------------------------------------------------------

[[ 伸展模式 (Extended Patterns) ]]

除瞭傳統的 regexp 語法外,Perl 還定義瞭一些額外的語法,
但在其它工具未必有這些語法,而且有些語法可能還在實驗階段,
說不定將來會被刪除,詳情請參閱說明文件。

這些語法都是這樣子的:

(?char)

而 char 就錶示伸展的種類。

------------------------------------------------------------------------------------------------

[[ 伸展模式 - 內嵌註解 (Embedding Comments) ]]

語法:
(?#text)

在 text 位置的東西會當作註解,
但要留意 text 內不可以含有右括號。

例:
$pattern = '(?# THIS IS A COMMENT)(A| |\\|#)';

------------------------------------------------------------------------------------------------

[[ 伸展模式 - 非捕捉群組 (Non-capturing groupings) ]]

語法:
(?:pattern)

之前提到括號有個特彆的作用,就是會把配到的東西放進 $1, $2,...,
例如:

$time_string = '12:34:56';
$pattern = '(dd):(dd):(dd)';

if ($time_string =~ /$pattern/) {
($hour, $minute, $second) = ($1, $2, $3);
print "hour=$hour,minute=$minute,second=$second";
}

但如果您不想放的話,可以用 (?:pattern):

$time_string = '12:34:56';
$pattern = '(dd):(?:dd):(dd)';

if ($time_string =~ /$pattern/) {
($hour, $minute, $second) = ($1, $2, $3);
print "hour=$hour,minute=$minute,second=$second";
}


因為「分」那部份使用瞭(?:pattern) ,所以就不會放到本來的 $2,
這就輪到「秒」的部份放到 $2瞭。

------------------------------------------------------------------------------------------------

[[ 伸展模式 - 內嵌修飾詞 (Embedded Modifiers) ]]

語法:
(?imsx-imsx:pattern)

之前提到可以用 i 修飾詞來做不分大小寫的配對,例如:

$st = '11AB22Ab33aB44ab';
$pattern = 'AB';

@matches = $st =~ /$pattern/ig;

這樣整個 $pattern 都是不分大小寫瞭,
如果想某部份分辨大小寫,某部份不分辨,
可以用內嵌的寫法。

$st = '11AB22Ab33aB44ab';
$pattern = '(?i:A)(?-i:B)';

@matches = $st =~ /$pattern/g;

錶示 A 不分大小寫,B 就分辨大小寫。
如果修飾詞前麵是減號,錶示關閉該修飾詞,
例如 (?s-i),錶示啓動 s 修飾詞,關閉 i 修飾詞。

其實內嵌修飾詞的語法,是在非捕捉群組內加入修飾詞而己。

------------------------------------------------------------------------------------------------

[[ 伸展模式 - 往前看(Look-ahead)和往後看(Look-behind) ]]

語法:
往前看(正)(Positive Look-ahead) (?=pattern)
往後看(正)(Positive Look-behind) (?<=pattern)
往前看(負)(Negative Look-ahead) (?!pattern)
往後看(負)(Negative Look-behind) (?
舉例來說:

$st = 'ABCDEFGH';
$pattern = 'w{2}';
@matches = $st =~ /$pattern/g;


執行結果:
0 : AB
1 : CD
2 : EF
3 : GH

您可以想像它是由左往右走,當配到一個match,
下一次就由match之後開始走:

ABCDEFGH
由A的位置開始走,配到 AB,剩下 CDEFGH ('AB')
由C的位置開始走,配到 CD,剩下 EFGH ('AB', 'CD')
由E的位置開始走,配到 EF,剩下 GH ('AB', 'CD', 'EF')
由G的位置開始走,配到 GH,剩下 ('AB', 'CD', 'EF', 'GH')


如果想在走路的時候,還要同時往前麵看,
可以用「往前看」或「往後看」。
例如仍然要找齣 w{2},但同時要檢查它的前麵(即右麵)必須是w{2},
可以寫:

$pattern = 'w{2}(?=w{2})';

執行結果:
0 : AB
1 : CD
2 : EF


這裏的 (?=w{2}) 用瞭「往前看(正)」,
這部份是不會配到任何字元,隻是用來檢查字串的特性:

ABCDEFGH
由A的位置開始,配到AB,往前看到CD,剩下 CDEFGH ('AB')
由C的位置開始,配到CD,往前看到EF,剩下 EFGH ('AB', 'CD')
由E的位置開始,配到EF,往前看到GH,剩下 GH ('AB', 'CD', 'EF')
由G的位置開始,雖然GH 可以配到w{2} ,但往前看不到 w{2},所以沒有match
完結

同理,如果改用「往後看」:

$pattern = '(?<=w{2})w{2}';

執行結果:
0 : CD
1 : EF
2 : GH

ABCDEFGH
由A的位置開始,直至走到C的位置時,
纔能夠往後看到 AB,配到CD,剩下 EFGH ('CD')
由E的位置開始,往後看到CD,配到EF,剩下 GH ('CD', 'EF')
由G的位置開始,往後看到EF,配到GH,剩下 ('CD', 'EF', 'GH')
完結


Negative Look-ahead 是 Positve Look-ahead的相反,
例如仍然要找齣 w{2},但同時要檢查它的前麵必須「不是」w{2},
可以寫:

$st = 'ABCDEFGH';
$pattern = 'w{2}(?!w{2})';
@matches = $st =~ /$pattern/g;


執行結果:
0 : FG

因為 'FG'的右麵隻有 'H' ,即 w ,而不是 w{2},
所以配到。

分享鏈接



看最新新聞就到趣味新聞網
quweinews.com
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!


tag

相关新聞

RiS獨傢綫上簡報:Yahoo! & Flex / Flash琴瑟共鳴

RiS獨傢綫上簡報:Yahoo! & Flex / Flash琴瑟共鳴

    很榮幸前天受Yahoo!之邀到颱灣分公司做Tech talk的分享,這次演講的主題著重在Yahoo!開發平颱與Flex / AIR上的整閤、善用與延伸,以取得更好的「社交機會(yahoo)」與「使用者豐富體驗(Flex/AIR/Flash)」。 看大傢.......


S0NY老掉牙機型DSC-w50

    請問各前輩那裏可以找到S0NY老掉牙機型DSC-w50 的使用說明書? 這種機型有防手震功能嗎?.......


SBLIVE EAX環境設定檔

    請問*.aup(EAX環境設定檔)單個可另外儲存及讀入,若是一大堆*.aup 可否有方法快速另存及讀入呢? [ 本帖最後由 ss055045 於 2008-8-10 21:40 編輯 ].......


SD卡會突然讀不到

    最近我的iPAQ(2490)運作到一半,SD卡就突然失蹤讀不到,請問應該如何處理 謝謝.......


SD記憶卡格式化

    不好意思 又要再一次麻煩各位大大 想請問一下 SD卡格式化還可不可以救的迴來 如果可以請給我軟體名稱 謝謝 我不知道適不適閤在這開這一帖 如果不行,麻煩版大幫我刪除.......


SERVER資料備份

    請問各位大大,是否有辦法將兩颱SERVER資料同步,例如A和B兩颱server 在A齣問題時,能夠馬上使用B繼續工作。 [ 本帖最後由 小善人 於 2008-7-16 09:43 編輯 ].......


SONY H係列

    哪一颱評價比較好??白天和夜晚的拍攝品質如何??還是有推薦哪颱??.......


SONY T70照相問題

    各位數位相機討論區的大大好 小弟第一次來到此地 有些有關相機的問題想請問 問題如下 前幾日  小弟去畢業旅行   理所當然 帶著心愛的相機一起齣遠門 可是在國道上照著照著 後來不知為何   照齣來的這片  都會很白 還會齣現橫條紋 還過度.......


SONY NWZ-A726

    小弟想買這一型號的mp3 但不知音質如何,有買瞭的大大可以分享一下嗎?.......


SONY T10

    我的相機T10好像照起來都很模糊耶!! 賣相機的說有防手震!但是好像動一下就很模糊! 快門也很慢按下去約1.5秒纔有動作..這正常嗎? 整個感覺真差!@@比一些啊撒晡魯的相機還濫! 是我調整的問題.還是相機本身問題? 我買迴來都沒去調過耶! 是不是.......


SONY T700...

    問題:           1.T700可以跟Canon這牌子哪係列型號一樣或差不多.           2.我要自拍還有齣去玩拍風景而已要買很好的麻?           3.預算一萬二以內.           4.颱南哪有好店傢.    .......


SONY W300

    最近要齣國唸書想買一颱相機,以前完全沒用過相機,上次看到W300的廣告打得很兇,後來直覺就是它瞭。 請問W300會很操作復雜嗎﹖和T300哪個較好?(價錢一樣) 我朋友都叫我買T300。.......


SONY a350的鏡頭選擇

    想要請各位給個建議 想要買鏡頭 目前是a350+18-70KIT 因同時考慮到未來陸續購入的鏡頭 目前的想法是 1.16-105或A18當作旅遊鏡 2.28mm-50mm的定焦鏡 3.A16 4.再一支長焦段的鏡頭 5........


SONY α900 全片幅單眼相機 齣來瞭

SONY α900 全片幅單眼相機 齣來瞭

    SONY α900 特點     * 搭載全片幅,24.6MP的CMOS影像感測器, 最大成像 6048 x 4032 像素     * 使用 DT 鏡頭時,會改為 1.5X 焦長轉換,像素值則是變成 11MP     * 雙核心,來自Sony的D.......


SONY 數位相機問題

    想請問各位大大,SONY T500 & T700差在那裏 幫同事問,同事說兩颱纔差一張小朋友 我想請問兩颱的差異差在那裏 能越詳細越好 p.s同事是女的,相機的用途不外乎就是齣去玩拍,自拍那一方麵的,他不考慮彆牌的 謝謝!!!.......


SONY 的W170...

    最近想買颱數位相機    我覺得SONY 的W170還不錯 但有看到有些對SONY不好的評價   讓我有點不知道要選哪傢的~ (SONY真的像有些人說的那麼差嗎?? 恩.....還有  網路上有人說SONY除高價位的相機外   其他很多都是大陸.......


SONYF707超怪的對焦[快門按一半]就關機

    我的F707超怪的對焦[快門按一半]就關機 超奇怪 好像不是電池問題耶= = ''' 是哪裏齣問題瞭呢????.......


SONY數位相機~3台比較

    T200,T300,T70這三颱 哪一颱比較OK阿??? 聽說觸碰螢幕比較耗電是嗎??? 還有啥優缺點阿??.......


SONY液晶電視的型號疑問求助!

    SONY 52吋液晶電視X係列最近正在考慮敗傢中.可是............. 突然發現型號有3種 1.52X2500 2.52X5000 3.52X1-R 有哪位大哥可以說明一下這三種型號到底有什麼不一樣?哪一種是公司貨哪一種是水貨?還有功.......


SONY的W300問題

    請問各位有買過SONY-W係列的大大... 小弟最近想要購入W300,可惜對相機是一知半解 想瞭解W300好用嗎?拍起來如何呢?? 或是有大大可以推薦不用錯的相機... 先謝謝啦.......


SONY的W300跟W170差彆在哪裏?

    這兩款是姐妹機嗎? 目前我隻知道...差彆有畫數,廣角.. 還有彆的差彆嗎? 可否達人可以分析一下... 因為已經確定要買2颱其中一颱嚕..^^.......


SP 570uz 說明書

    由於買的是平行輸入貨 網路上隻找到 簡體版的說明書 小弟很笨 有些看不懂 所以想問問有人可以提供 繁體說明書嗎? 謝謝 [ 本帖最後由 KOF5002001 於 2008-7-14 01:12 編輯 ].......


SP2跟SP3的問題

    請問各位大大       我的電腦剛重灌完,如果我直接安裝SP3的話 那還要安裝SP2嗎?還是安裝SP3就有安裝SP2的效能瞭? SP3跟SP2要分開安裝嗎? 請各位幫我解答一下 發文請看一下Windows 係統版 發問規則 http://ck1.......


SPB MOBILE SHELL問題

    請問安裝好以後是否不會取代原本TODAY的桌麵,而是在右下角多瞭SPB的選項而已? 如何能取代原本的TODAY桌麵呢?刪除TODAY的程式嗎? 我的PDA手機是ASUS P552W 第一次使用還不太會用 謝謝.......


SPB mobile Dvd (十萬火急)

    他的註冊機要如何使用   請各位高手幫個忙   感激不盡   .......


SQL - MySQL Master/Slave Server 架設

    MySQL 提供 Master/Slave 機製讓您輕易的完成多個 MySQL Server 之間的資料同步,有瞭多個資料同步的 MySQL Server 在管理上會較有彈性,例如你可以建置備援主機或是進行負載平衡等等。但是要注意:一颱 Master Se.......


SQL - MySQL 資料庫的備份與還原

    MySQL Server 的日常維護中最重要的一項大概就是資料庫的定時備份,而 MySQL 資料庫的備份方式有很多但一般來說大緻上可概分為二種: Binary Copy (直接復製資料庫檔案) Dump Database (將資料庫輸齣成為文字檔).......


SQL Server 2005無法安裝

    因上課關係所以要用到SQL Server 2005試用版,但是我的電腦無法安裝SQL Server 2005,可是一直無法找齣問題在哪,希望有類似問題的大大可以教教我 [ 本帖最後由 李斯特霍華 於 2008-11-14 10:19 編輯 ].......


Seagate 7200.11 的新韌體光碟更新方法.

    更新方法如下.. 1.將下載.iso檔燒成光碟. 2.將到bios將硬碟介麵選項AHCI改成ide介麵(有些主機闆會無法辨識).開機選項改成光碟機. 3.直接用光碟開機. 4.進入到閱讀檔離開ESC. 5.進入選項視窗.選擇你的硬碟型號會有型號代.......


Seagate 官方坦承硬碟存在問題以及需要更新韌體

Seagate 官方坦承硬碟存在問題以及需要更新韌體

    Seagte 官方的聲明︰ http://seagate.custkb.com/seagate/crm/selfservice/search.jsp?Tab=search&Hilite=&Module=selfservice&TargetLanguage=selfservice&DocId=207931&NewLang=en 以下為官方承認的硬碟型號 Barracuda 7200.11 DiamondMax 22 Barracuda ES.2 SATA SV35 承認.......


Securom加密遊戲的燒法?

    遊戲是nfs 11代使用Securom加密 酒精裏麵有一項設定模擬次通道資料修復及模擬 是不是燒錄的時候把這項打勾就好瞭? 光碟機有特殊要求嗎? [ 本帖最後由 李斯特霍華 於 2008-12-22 22:39 編輯 ].......


Sennheiser

    本帖最後由 bogo0908 於 2011-2-12 21:27 編輯 .......


ServicePackFiles可殺嗎?

    安裝完SP3 windows裏多瞭個資料夾叫ServicePackFiles 請問這個可以殺嗎 滿佔空間的~謝謝 [ 本帖最後由 tone.chang 於 2008-5-20 00:55 編輯 ].......


Shin Sangokumusou 5

    想請問我剛下載完遊戲檔解壓完後 的到一個.mdf檔使用酒精掛載時 齣現訊息"無法存取映像檔" 想請問該如何解決?謝謝! [ 本帖最後由 bogo0908 於 2008-7-20 23:24 編輯 ].......


SiRFInstantFixII 是什麼 ? 如何下載 ?

    神達Mio Moov 車用導航係列 獨傢的新科技SiRFInstantFixII,更可加強導航衛星的訊號接收速度, 使用者隻需約5秒左右就可快速定位 ! 是真的 ? SiRFInstantFixII 是什麼 ? 如何下載 ? [ 本帖最後由 pozane 於 2008-5-28 06:49 編輯 ].......


Smart PC Recorder V2.5 (錄音工具) 繁體中文化綠色版

Smart PC Recorder V2.5 (錄音工具) 繁體中文化綠色版

    軟體大小:550 KB 軟體語言:繁體中文 軟體類彆:媒體製作 執行環境:Win 軟體授權:免費軟體 更新時間:2008-6-15 Smart PC Recorder是一款非常好用的錄音工具。它能將您電腦音效卡發齣的各種聲音錄製成MP3.......


So-net服務好不好?

    我傢是用SO-NET固I的使用者 速率是2M/256K 最近因為閤約到瞭想要升速 想升到SO-NET的固I的8M/640K 但來卡國看看後 8M好像是共用綫路不是專綫所以不一定會比2M快 我個人使用SO-NET服務1年多瞭,雖然目前感覺還不錯,.......


SolidWorks開啓後草圖背景怪怪的

    圖紙變的像彩色波浪 我是用2008版的請問為什麼圖紙會變這樣? 我電腦的配備 CPU   E6550 VGA   7900GTX RAM   1G*2 應該跑得動吧? [ 本帖最後由 李斯特霍華 於 2008-12-15 17:59 編輯.......


Sony A300 或是A350

    各位大大 ~小弟最近想要買sony的單眼像機(不要問我為啥要買SONY的不買K或N牌的 ...)所以我想請教一下,300跟350要買哪個好??他們是隻有像素的差彆嗎? 請指導一下 P.S. 新手是我...我是新手.......


Sony Bravia的液晶哪台適閤看運動比賽

    眼看奧運快到瞭 傢裏還是那颱幾年前的SD電視 老哥最近就一直在我爸耳邊唸 說他要幫中華隊加油 想要換個好一點的電視 結果這樣唸瞭幾天 我爸還真的答應他瞭...= = 現在是考慮要買Sony的Bravia啦 因為之前有在雜誌上看過介紹 說.......




Regular Expression 新手入門

“新品發布”UsingPattern電動扳手設計

教你看懂新聞標題

選擇多! 臉書不隻可按贊 將新推6「錶情符號」

翻譯新選─微軟Translator App


前一篇新聞
Refined EVO X
后一篇新聞
Revit 2009繁體中文版正式開放下載





© 2025 - quweinews.com. All Rights Reserved.
© 2025 - quweinews.com. 保留所有權利