这个正则表达式是什么意思.检查http或https超链接就足够了吗
What does this regular expression mean. Is it enough to check http or https hyperlinks?
有人能提供建议吗?替换所有方法是如何工作的?
message = message.replaceAll("(?:https?|http?)://[''w/%.''-?&=!#]+",
"<a href='$0' target='_blank'>$0</a>");
您应该一步一步地了解:
(?:https?|http?)
|
->表示OR,因此表示匹配https或http
?
->(仅在此)表示可选元素,https中的"s"是可选的,http中的"p"也是可选的。您的意思可能是:"(https)?|(http)?
",使每个选项都是可选的。但这仍然是错误的,因为您可以匹配这样一个字符串:"://someLink
",这是没有意义的。
我想你想匹配https或http,所以你这里的正则表达式需要改为:
https? (to make only the s optinal)
?:
->它定义了一个非捕获组(这意味着它将被匹配,但不会出现在输出中——不会在结果中捕获),这与regex组有关。
()
->表示这是一个组事实上,这是第二组(第一组是整个比赛本身)
我认为上面已经很好地解释了这个正则表达式"://[''w/%.''-?&=!#]+
"。
这里发生的"魔术"是:"$0
",这被称为对匹配组的反向引用。因此,在您的消息String中,您与regex:匹配的结果
(?:https?|http?)://[''w/%.''-?&=!#]+
将替换为:
"<a href='$0' target='_blank'>$0</a>"
其中$0
实际上是用第一个正则表达式找到的东西。
这里有一个例子:
// I've simplified: ''w+ any number of characters
String regex = "https?://''w+";
String input = "http://value1 ; https://value2";
input = input.replaceAll(regex, "<a href='$0' target='_blank'>$0</a> ");
// this will output :
// <a href='http://value1' target='_blank'>http://value1</a> ; <a href='https://value2' target='_blank'>https://value2</a>
System.out.println(input);
您可以在此处测试regexp:http://gskinner.com/RegExr/它还有一些用户提供的regexp,您可以尝试。我尝试了您的regexp,但没有得到任何匹配项。但我玩了一点,我想你的意思是:(?:https?)://['w/%.'-?&=!#]+
,而且,我建议你使用
message = message.replaceAll(/(?:https?):'/'/['w'/%.'-?&=!#]+/g,
"<a href='$0' target='_blank'>$0</a>");
希望我能帮上忙。
编辑:我没有找到任何关于replaceAll
方法的文档,所以我建议您使用replace方法。你可以在这里试试:http://w3schools.com/jsref/jsref_replace.asp
此外,您没有任何捕获组(标记为(
和)
),因此$0在您的替换中不起作用。所以应该是
message = message.replaceAll(/((?:https?):'/'/['w'/%.'-?&=!#]+)/g,
"<a href='$1' target='_blank'>$1</a>");
请注意,我将整个regexp作为一个捕获组,并将$0替换为$1。您也可以有多个捕获组,例如(https?):'/'/(['w'/%.'-?&=!#]+)
,这里$1将是您的协议(http或https),$2将是链接的其余部分。something.com?i=1
replaceAll
是一个String
类方法,与Regex
匹配并用参数化字符串替换它。参数(如$0
)是匹配索引。
您的regex
应该匹配所有URL并将其转换为锚标记,但我建议进行一些改进:
-
在正则表达式中,您使用的是
(?:https?|http?)
。(?:SOMETHING)
匹配非捕获组,?
使前一个字符可选(因此它匹配http
和htt
。)您应该使用
https?
。 -
正则表达式类中通常不需要转义字符(如
-
或&
)。
因此正则表达式为:
.replaceAll("https?://[''w/%.-?&=!#]+", "<a href='$0' target='_blank'>$0</a>");
它说,与的字符串或字符串的一部分匹配
- 具有
http
或https
- 然后是
://
- 后面跟一个或多个字字符
[a-zA-Z0-9]
、/
、%
、.
、-
、?
、&
、=
、!
或#
用<a href='MATCHED_STRING' target='_blank'>MATCHED_STRING</a>
替换
现在,它会匹配所有URL吗?不。大部分,但不是全部。它将匹配my name is boxiehttp://random
,理想情况下,你会想放一个单词边界liek ''b
【删除误导性评论】
我不知道java正则表达式。但我试图解释一下基于javascript的正则表达式。
(?:https?|http?)
:http或https,如果不存在,可以。(?:…)表示没有内存分配。只要通过。
://
:这是与"://"相同的字符
[''w/%.''-?&=!#]+
:这是regex类,''w
:所有字符,(javascript应为'''w'
允许使用/, %, ', -, ?, &, =, !, #
字符+
表示一个[]或多个[]
和
$0
:返回完整匹配的仅地址部分排除"http"或"https"(javascript以index 1开头)。
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- 单击超链接时,如何使用Google Maps API v3缩放地图
- 用超链接替换URLS
- 使用JavaScript从超链接加载时的默认下拉值
- Hammer.js阻止在Android Webview中点击超链接
- 将超链接添加到“;标题“;标记文本
- 文本建议的超链接
- 用Javascript按钮替换Javascript超链接
- 删除默认的ui超链接行为
- 谷歌将广告超链接映射到国家标记
- 如何在点击超链接时调用fullcalendar回调
- 单击“禁用其他超链接”
- 为Angularjs制作超链接
- 指向的超链接刚刚赢得'不起作用
- 如何将超链接添加到通过传单创建的传单多段线.Draw
- 如何禁用鼠标中键单击超链接以在新选项卡或新窗口中打开
- 如何在每个动态创建的ImageButton周围包装超链接?Visual Studio
- 将数据库中的超链接添加到查询结果
- 想要在我的 GWT 应用程序 (Java 7) 中为每个 http/https 超链接添加锚 html 标记
- 这个正则表达式是什么意思.检查http或https超链接就足够了吗