tomy
Lv 4
tomy asked in 電腦與網際網路程式設計 · 1 decade ago

關於regular expression的指令問題

關於regular expression的指令問題...

假設我的文字內容如下(共五行):

Hint: newly added line~~~

Hint: how are you 你好嗎

how are you你好嗎

how are you你好嗎

Hint: Hi, there. 你好

how are you 好嗎

我想只針對"Hint:" 開頭的每一行進行搜尋,假設搜尋文字是"你好",那麼我希望只列出上述第二行跟第四行(有Hint開頭的部份)!

試過"^Hint:.*你好" ,但會列出前五行:

Hint: newly added line~~~

Hint: how are you 你好嗎

how are you你好嗎

how are you你好嗎

Hint: Hi, there. 你好

=> 這似乎是以最後一個"你好"當結尾,而以Hint當開頭的結果!但我要的是第一次遇到的"你好"當結尾,也就是Hint開頭的那一行,只要出現一次"你好",則那一行就是我要找的。

若改用"^Hint:.*?你好",這時我會找到

(1)

Hint: newly added line~~~

Hint: how are you 你好

(2)

Hint: Hi, there. 你好

情況好一點,但顯然(1)中的"Hint: newly added line~~~ "不是我要的,我該怎麼再修改呢?

麻煩高手給予指導,謝謝!

Update:

先謝謝您的用心! 其實這是我在一個支援regular expression的記事軟體(My Notes Keeper)上測試的結果,我並沒有寫程式,不過既然你起了頭,我follow你的寫法改了一下(那幾行應該要算在一個字串裡),卻是一個也找不到! Code在底下~

我想這應該是regular expression的語法問題,如果可以的話,或許您可以提供我不同的regular expression式子來達成我的需求! 因為我對regular expression實在不熟~ 當然程式上的問題,我也樂意討論~

Update 2:

Code在此: http://blog.yam.com/chinyanglin/article/11362431

(Sorry~ 這裡太難貼code了~)

Update 3:

您建議的方法在我的軟體上依舊行不通,但我可以確定的是,我使用的軟體對於RE的支援並不完整,導致跟一些工具測試的結果不一致,最後很感謝您願意幫忙解答。

1 Answer

Rating
  • 1 decade ago
    Favorite Answer

    嗯...沒看到你的程式碼, 不知道你用何種語言寫的, 我用 JAVA 試寫了一個測試程式, 請參考一下

    import java.util.regex.*;

    public class RegularExpressionTest {

    public static void main(String[] args) {

    String[] datas = new String[] {

    "Hint: newly added line~~~",

    "Hint: how are you 你好嗎",

    "how are you你好嗎",

    "how are you你好嗎",

    "Hint: Hi, there. 你好",

    "how are you 好嗎"

    };

    String[] patterns = new String[] {

    "^Hint:.*你好",

    "^Hint:.*?你好"

    };

    for (int i = 0; i < patterns.length; i++) {

    //程式執行結果輸出

    System.out.println("===========> Test begin : \""+patterns[i]+"\"");

    Pattern pattern = Pattern.compile(patterns[i]);

    for (int ii = 0; ii < datas.length; ii++) {

    Matcher matcher = pattern.matcher(datas[ii]);

    while (matcher.find()) {

    System.out.println(matcher.group());

    }

    }

    System.out.println("===========> Test end");

    }

    }

    }

    程式執行結果輸出如下

    ===========> Test begin : "^Hint:.*你好"

    Hint: how are you 你好

    Hint: Hi, there. 你好

    ===========> Test end

    ===========> Test begin : "^Hint:.*?你好"

    Hint: how are you 你好

    Hint: Hi, there. 你好

    ===========> Test end

    ====================== 我是分隔線 ===================

    測試結果 "^Hint:.*?你好","^Hint:.*你好" 這 2 種都能得到你想要的結果, 並沒有出現你所描述的狀況耶!!

    2007-08-17 10:04:46 補充:

    嗯....

    試一下這個 "Hint:(.*)好", 可以得到你要的效果.

    我用這個工具試出來的

    RegexBuilder http://renschler.net/regexbuilder/

    2007-08-17 10:36:31 補充:

    Sorry, 沒注意到你的題目

    "Hint開頭的那一行,只要出現一次"你好",則那一行就是我要找的"

    所以 pattern 字串要改成 "Hint(.*)你好" 這樣比較符合要求.

    另外 對於 "Hint開頭的那一行" 的那個要求, 有點小意見,個人認為題目的比對資料內容含有 \n, 雖然是表示為多行資料, 但 regular expression 實際進行比對時, ^開頭, $結尾, 都是 "一次性的比對", 並沒有所謂 "行" 的概念.

    Source(s): me
Still have questions? Get your answers by asking now.