学 JSP 的时候拿这个 blog 练手,其它的问题都有了解决方法,可 UBB 代码转换的问题过了 n 个月最后在 CSDN 第二次发问的时候问到了
这是我的问题
我的本意是把 [b]*[/b] 替换成 <b>*</b>
String str = "[b]1[/b] 2 [b]3[/b]";
str = str.replaceAll("\\[b\\](.*)\\[\\/b\\]", "<b>$1</b>");
out.println(str);期望结果是 <b>1</b> 2 <b>3</b>
可实际结果 <b>1[/b] 2 [b]3</b>
这个问题在 PHP 里很好解决,因为修正符里有个 /U (PCRE_UNGREEDY)可以禁止贪婪匹配(写到这的时候才发现这个的描述里有一句“It is not compatible with Perl”)
期间有人给出了符合我所说的,却不是我想要的。即在匹配抓取的时候排除 [ 号,但事实上有时候我还确实要抓取 [ 号,比方说站内文章搜索我使用了 [archive=xxx] 的格式,例如前一篇文章里就有一句“就像以前转过的一篇[url=[archive=10x]]《发烧症候群》[/url]里面说的那些玩相机的”,Sunmast 给出了个叫递归消除的可怕概念,看的头大,也看不明白,用起来也相当复杂,这时候终于有位叫“pigo”的给出了最佳解决方法:
str = str.replaceAll("\\[b\\](.*?)\\[\\/b\\]", "<b>$1</b>");
* 和 ? 都是限定符,我还真不知道他俩可以同时使用,查了一下 Java 的 api 文档,果然有这么一段,只不过当时不明白什么意思,也没有任何例子:
Greedy quantifiers <= 默认都是贪婪匹配
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m timesReluctant quantifiers <= 这个就是我想要的
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m timesPossessive quantifiers <= 不过这个还不明白什么意思
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
年前似乎是来不及把这个 blog 改成 jsp 版的了
