2010-05-02 10 views
0

只需要寫一個正則表達式來匹配以下字符串集。我想寫這符合以下所有字符串TCL編寫正則表達式所需的幫助 - TCL

I)(XYZ XZZ XVZ XWZ)

線索的表達式:啓動串是X和Z結尾的字符串是相同的所有對。只有中間的字符串不同YZV W.

我的審判:[regexp {^X([Y|Z|V|W]*)Z$}]

我想寫一個正則表達式的另一個捕獲它/只以下字符串的地方來

II匹配)(XYZ)

我的試用版:[regexp {^X([Y]*)Z$}]或簡單地regexp {^XYZ$}

只是想確保其正確的做法。是否有可用的任何其他方式來優化正則表達式:)

我)第一次測試題

set to_Match_Str "XYZ XZZ XVZ XWZ" 
    foreach {wholeStr to_Match_Str} [regexp -all -inline {X[YZVW]Z} $to_Match_Str] { 

    puts "MATCH $to_Match_Str in the list" 
    } 

只會打印XZZ XWZ從列表中。它的葉子XYZ & XVZ 當我包含paranthesis [regexp -all -inline {X([YZVW])Z} $ to_Match_Str]。它打印出所有的中間人物正確YZVW

回答

0

我的審判:正則表達式{^ X([Y | Z | V | W] *)Z $}]

這將匹配的字符串給定,但是當你使用乘法器時,它也會匹配諸如「XZ」,「XYYYYYYYYYYYYYYYYZ」和「XYZYVWZWWWZVYYWZ」之類的字符串。要匹配的中間人物只有一次,不要用一個乘數:

^X([Y|Z|V|W])Z$ 

我的審判:正則表達式{^ X([Y] *)Z $}]

同在那裏,它也會匹配諸如「XZ」,「XYYZ」和「XYYYYYYYYYYYYYYYYZ」之類的字符串。不要把乘數的設定後:

^X([Y])Z$ 

或者乾脆正則表達式{^ XYZ $}

這不會抓到任何東西。讓它做同其他(趕上Y特性),你需要括號:

^X(Y)Z$ 
3

I)(XYZ XZZ XVZ XWZ

線索:啓動字符串XZ結束串所有配對相同。只有中間的字符串不同Y Z V W

我的審判:[regexp {^X([Y|Z|V|W]*)Z$}]

假設你身邊的一大堆文字括號後是不是,你匹配,使用這樣的:

regexp {X([YZVW])Z} $string -> matchedSubstr 

這是因爲內部的串都是單個字符。 (它也將匹配的子字符串存儲在變量matchedSubstr中;在那裏選擇任何變量名稱。)在正則表達式中,不應在[]內使用|,因爲它在那裏沒有特殊含義。 (您可能需要添加^$錨輪之外。)

在另一方面,如果你想匹配多個字符序列(其中Y等只是替身),那麼你使用:

regexp {X(Y|Z|V|W)Z} $string -> matchedSubstr 

注意|在這裏被使用,但[]

如果你真正的字符串有很多這樣的字符串(您使用的是與它們匹配爲準模式),然後提取它們所有的最簡單的方法是用-all -inline選項regexp,通常在foreach像這樣使用:

foreach {wholeStr matchedSubstr} [regexp -all -inline {X([YZVW])Z} $string] { 
    puts "Hey! I found a $matchSubstr in there!" 
} 

混合搭配品嚐。

我的審判:[regexp {^X([Y]*)Z$}]或者乾脆正則表達式{^XYZ$}

只是想確保它是一個正確的做法。是否有任何其他方式可用於優化正則表達式:)

這是精確比較的最佳選擇。事實上,如果是字面意義的話,Tcl會在內部對其進行優化以得到直接的字符串相等測試。

+1

好吧,它沒有比Tcl核心團隊成員的回答更具權威性。乾杯。 :) – 2010-05-02 11:08:10

+0

這個問題唯一棘手的問題是確切地解決了問題。 (正常情況下,那些熟練提問的人通常不需要首先提問,所以我更願意幫助人們提出更好的問題:-)) – 2010-05-02 11:51:42

+0

@Donal第1個問題測試 set to_Match_Str「 XYZ XZZ XVZ XWZ」 的foreach {wholeStr to_Match_Str}正則表達式 - 所有-inline {X [YZVW] Z} $ to_Match_Str] { 提出 「MATCH $ to_Match_Str列表中的」 } 只會打印XZZ XWZ從列表。它包含XYZ和XVZ當我包含paranthesis [regexp -all -inline {X([YZVW])Z} $ to_Match_Str]。它將正確打印所有中間字符Y Z V W – user330727 2010-05-03 01:24:30

0

您可以使用Visual Regexp工具提供幫助,它在構建正則表達式時提供反饋。