none
求一正規表示式 RRS feed

  • 問題

  • 大家好,假設一字串如下:

    「 +ab c ""aaa "bbb" " ddd  +eee " 」

    最前面及最後面各有一個空格,另外中間的「aaa」前面是連續兩個雙引號。

     

    今想由正規表示式來取出子字串如下:

    「+ab」「c」「aaa」「bbb」「ddd +eee 」

    也就是說,有兩個雙引號括起來的,就取引號中的字(或連頭尾的雙引號都取出也行),沒有的話,就依空白來分割取字

     

    結果我試驗的結果

    1、建立表示式「("[^"]*") | ([^"\s]+)」去取,   

    只得到「+ab」「c」「"bbb"」「"ddd +eee 」,也就是「aaa」漏掉了,是哪裡錯了嗎?

     

    ----說明一下,我的表示式,前半是找頭尾都是雙引號,且中間是非雙引號的任意符,後面是找非雙引號也非空白所組成的連續字符

     

     

    註:附上程式,方便大家測試:

    ArrayList a=new ArrayList();
    string s=" +ab c \"\"aaa \"bbb\" \" ddd  +eee \"  ";
    string p="(\"[^\"]*\") | ([^\"\\s]+)"; 
    System.Text.RegularExpressions.MatchCollection c=System.Text.RegularExpressions.Regex.Matches(s,p);

    IEnumerator ie=c.GetEnumerator();
    while(ie.MoveNext())
        a.Add(((System.Text.RegularExpressions.Match)ie.Current).Value);

     

    string[] result=(string[])a.ToArray(typeof(string));

    //看轉出來的result這個string[]即可知道答案

    2007年11月6日 下午 12:27

解答

  • [^"\s]+ 可以抓到

    【+ab】【c】【aaa】【bbb】【ddd】【+eee】

     

    ".*?"|(\S+) 可抓到

    【+ab】【c】【""】【aaa】【"bbb"】【" ddd  +eee "】

     

    2007年11月6日 下午 03:40

所有回覆

  • [^"\s]+ 可以抓到

    【+ab】【c】【aaa】【bbb】【ddd】【+eee】

     

    ".*?"|(\S+) 可抓到

    【+ab】【c】【""】【aaa】【"bbb"】【" ddd  +eee "】

     

    2007年11月6日 下午 03:40
  •  

    Hi,謝謝你的回答,真的可以了。

    但是我還是想了解一下,為什麼我的寫法,match不到「""」跟「aaa」呢?

    2007年11月7日 上午 01:54
  • 你的 regex 太 greedy 了...一個 pattern 抓太長...剩下的字串就沒有地方比對啦....

     

    2007年11月7日 上午 06:37