作者godfat (godfat 真常)
看板java
标题Re: [闲聊] Java中的regular expression
时间Sat Jun 6 22:55:07 2009
唔,先假设 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
1F:→ godfat:btw, 可以回忆一下 php 的 magic quotes, 失败的东西 06/06 22:58
2F:→ godfat:还有 big5 许功盖的问题.. 06/06 23:00