Re: [閒聊] Java中的regular expression
唔,先假設 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
06/06 22:58, 1F
→
06/06 23:00, , 2F
06/06 23:00, 2F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):