有些东西你永远match不上 (java)

mehere8 2010-07-01 07:36:42
在看regular expression java应用时,发现API里面的Pattern class 的 match method.

它的DOC显示的是attempt to match the entire input sequence against the pattern 这就早就了它奇特的属性:某种pattern你无论有什么样的input sequence它都match不上

可以写这么一个命题:

对于任意的string, 存在某个正则表达式(pattern),使得 Pattern.matches(pattern,string) 返回值为false

那么,这个正则表达式长什么样子呢?如果是一般的字符串那肯定可以match上,如果是一些character class里面的construct像\d [x-z] 等等 也可以写出某个string让它match上。甚至,连一些special control character(ctrl alt ...)只要在string里面写ASCII码一样可以match. 那到底是什么不能match呢?

大家如果留心看java documentation Pattern那章的Summary of regular-expression constructs表就会发现最后还有个special constructs 像(?... )这样的。它就像个探测器,看看左边,再看看右边,如果满足条件就返回true。例如 (?<=\()\d+(?=\)) 这样的正则表达式, 那么字符串 java(123)java 中就有满足该正则表达式的部分--123,因为123左边有个左括号,右边有个右括号; 而java123java就不行了,因为123没有被括号包围住。

我们的Pattern.matches()里 正则表达式和string必须得全部相符才能match,而正则表达式中 (?=...)这一部分只表明string中某个字符前或后有这样的形式(例如括号);该形式(例如括号)出现在了string中,则其必须与正则表达式pattern里的某部分匹配;而正则表达式中没有匹配的... 因此有了(?=...) 并且在此之前没有可以与该形式(例如括号)匹配的形式的话,那么永远就没有string可以与该正则表达式match

如下:

01.Pattern.mathces("(?<=\\()\\d+(?=\\))",aString);   
02.// aString -- input sequence


瞧瞧,什么样的aString可以让第一行返回true? 答案是没有

因此在上述的命题里,pattern写成lookaround的形式,即(?<=certainChar)certainChar(?=certainChar) 那么什么样的字符串就与这正则表达式永远match不上了。


你一定会瞪大眼睛说--啊,怎么会有match不上的string呢?一定是正则表达式出了问题!哈哈,看看命题是怎么说?命题只说了是存在某个正则表达式,并没有说任意的正则表达式都不能match啊 :) (像离散数学中的:∀p∃q and ∀p∀q are not equivalent)

我们可以改改正则表达式 \((?<=\()\d+(?=\)) \) , 这样就有字符串entirely matched


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mehere8/archive/2010/07/01/5707707.aspx
...全文
139 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mehere8 2010-07-04
  • 打赏
  • 举报
回复
不是的 像(?<=字符A)字符B 的正则表达式 那么你写 字符A字符B 可以部分匹配 由于Pattern.matches()是完全匹配 所以你无论怎么写都匹配不上
这可以说是matches() method的与正则表达式一起造成的一种特性
非典型射手 2010-07-02
  • 打赏
  • 举报
回复
a > 1 && a < 1?
是这个意思么?
  • 打赏
  • 举报
回复
这种称为“环视”,环视一共有四种形式。
ZangXT 2010-07-01
  • 打赏
  • 举报
回复
不懂,帮顶

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧