Re: [閒聊] Java中的regular expression

看板java作者 (godfat 真常)時間15年前 (2009/06/06 22:55), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串3/4 (看更多)
唔,先假設 escape character 和 regular expression 已知, 那麼其實這只是有沒有 literal (字面常數)的差別而已。 由於在 string 裡面表達 \ 需要用 \\ 而在 regular expression 裡表達 \ 也同樣要 \\ 但 java 沒有 regexp literal, 因此我們需要用 string literal 表達, 接著再把這個 string 做成 regexp, 多了一層,因此 2*2 => 4 (如果還要再包一層,而這層又是 \ => \\, 那就會是 4*2 => 8 要 \\\\\\\\ 才能夠表達真正的 \ ) 如果有 regexp literal 的話,就可以不用多此一舉。 比方說 ruby 用 / 包起來的東西,就是 regexp literal. 以你的例子,就會是: txt = "Charlie I love you >\\\\<" re = /\\/ 不需要多 escape 一次。但如果要用 string 表達,同樣需要多一次: re = Regexp.new("\\\\") 以上兩個 re 是等價的。而由於 ruby 用 / 做 regexp 的邊界, 所以就跟 string 需要用 \" 表達 " 一樣,這邊要表達 / 也會需要 \/ e.g., re = /\// 會等同於 Regexp.new('/') 和 %r{/}, 因為也可以用 %r{...} 來包 regexp literal 同理,在 %r{} 裡要表達 { 或 }, 就需要 \{ 和 \} 而在 ruby 的 gsub 裡,還有一個陷阱,不過這邊就不提了... 簡單地說就是,因為 \ 有特殊意義,因此也需要 \\ 來表達。 (所以 ruby gsub 這邊也是 "\\\\" 才能表達 \) 甚至 scala 還有 xml literal: scala> val xml = <abc/> xml: scala.xml.Elem = <abc></abc> 所以你不需要寫類似這樣: new XmlNode('<abc/>') 只要直接寫 <abc/> 不用任何東西包住就行了。 (能這樣做的原因,當然也是因為 xml 本身就有特定格式,且和一般程式語法不同) 沒什麼神奇的東西,只是有些東西因為有特殊意義, 所以需要用特殊的表達方式而已。只要想一件事: 我這樣寫,compiler/interpreter 會不會搞錯我想說的事?(ambiguous) 如果會,就會需要別種方式,來區別兩種以上可能的意義。 -- In Lisp, you don't just write your program down toward the language, you also build the language up toward your program. 《Programming Bottom-Up》- Paul Graham 1993 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

06/06 22:58, , 1F
btw, 可以回憶一下 php 的 magic quotes, 失敗的東西
06/06 22:58, 1F

06/06 23:00, , 2F
還有 big5 許功蓋的問題..
06/06 23:00, 2F
文章代碼(AID): #1AAeDENy (java)
文章代碼(AID): #1AAeDENy (java)