Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and the Yahoo Answers website is now in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

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.