2013-07-01 41 views
2

我在正则表达式中非常虚弱,我使用的正则表达式(从网上找到)只能部分解决我的问题。我需要使用java将文本输入中的锚点标记添加到URL中。这里是我的代码:正则表达式只匹配URL的一部分 - 为什么?

String text ="Hi please visit www.google.com"; 
String reg = "\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))"; 
     String s = text.replaceAll(reg, "<a href='$1'>$1</a>"); 
     System.out.println(""+s); 

输出目前Hi please visit <a href='www.google.c'>www.google.c</a>om。正则表达式有什么问题?

我需要解析一个文本,并显示从文本字段输入的URL作为jsp页面中的热链接。预计实际产量将

Hi please visit <a href='www.google.com'>www.google.com</a> 

编辑

以下的正则表达式

(http(s)?://)?(www(\.\w+)+[^\s.,"']*) 

作品就像在.com结尾的网址魅力,但在像.jsp。就是有什么办法其他扩展失败因为它在各种扩展中工作?

+2

我都是使用'regex',但你为什么要用它呢? –

回答

2

的Java识别POSIX表达式(see javadoc),但语法是有点不同。它看起来像这个:

\p{Punct} 

不过,我想简化你的正则表达式的URL:

(?i)(http(s)?://)?((www(\.\w+)+|(\d{1,3}\.){3}\.\d{1,3})[^\s,"']*(?<!\\.)) 

和精心制作的,只如果你发现打破它一个测试用例。

作为一个Java线将是:

text = text.replaceAll("(?i)(http(s)?://)?((www(\\.\w+)+|(\\d{1,3}\\.){3}\\d{1,3})[^\\s,\"']*(?<!\\.))", "<a href=\"http$2://$3\">$3</a>"); 

注的“S”的“https”中整齐捕获(如果找到),如果需要恢复。

+0

谢谢..这是一个很棒的答案。但它不起作用,如果URL是'www.askqology.com/CareWave/login.jsp'。返回的URL将省略.jsp,但它在其他情况下奇妙地工作 – ntstha

+0

@ntstha对!当然。我修改了正则表达式,以便URL不能*以点结尾(如果是这样,它被认为是标点符号并保持原样)。我还添加了'(?i)'使匹配不区分大小写。见编辑的答案。 – Bohemian

+0

谢谢先生。您的正则表达式完美工作。 – ntstha

4

要回答你的问题为什么正则表达式不起作用:它不遵守Java的正则表达式语法规则。

具体做法是:

,你期望它因为Java不承认喜欢[:punct:] POSIX速记不起作用。相反,它将其视为嵌套的字符类。这再次导致^在这方面成为非法,所以Java忽略它,让你用一个字符类匹配一样

[:punct\s] 

只匹配comc,因此结束你的对手那里。

至于你如何在一段文字中查找网址的问题,我建议你阅读Jan Goyvaert的优秀博客条目Detecting URLs in a block of text。你需要决定自己对于你的正则表达式的敏感程度和具体程度。

例如,提出的解决方案在帖子的末尾将转换为Java作为

String resultString = subjectString.replaceAll(
    "(?imx)\\b(?:(?:https?|ftp|file)://|www\\.|ftp\\.)\n" + 
    "(?:\\([-A-Z0-9+&@\\#/%=~_|$?!:,.]*\\)|\n" + 
    "  [-A-Z0-9+&@\\#/%=~_|$?!:,.])*\n" + 
    "(?:\\([-A-Z0-9+&@\\#/%=~_|$?!:,.]*\\)|\n" + 
    "  [A-Z0-9+&@\\#/%=~_|$])", "<a href=\"$0\">$0</a>"); 
+0

thnks用于识别问题。但我也需要解决方案。我的正则表达式知识对我自己来说很难解决。 – ntstha

+0

@ntstha只需在类[[:punct:]':'] [!'#$()* +,。/:; <=>?@ \^_'{|}〜-' – Jerry

+0

thnks sir..would你介意张贴正则表达式在你的答案。我没有添加字符,但它给我模式语法异常。我错过了什么。 – ntstha