任何人都可以提供建议吗?如何替换所有方法?
message = message.replaceAll("(?:https?|http?)://[\\w/%.\\-?&=!#]+",
"<a href='$0' target='_blank'>$0</a>");
答案 0 :(得分:1)
你可以在这里测试你的正则表达式:http://gskinner.com/RegExr/它还有一些你可以尝试的用户贡献的正则表达式。我试过你的正则表达式并没有得到任何匹配。但我玩了一下,我认为你的意思是:(?: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>");
请注意,我将整个正则表达式设为一个捕获组,并将$ 0替换为$ 1。您也可以拥有多个捕获组。 (https?):\/\/([\w\/%.\-?&=!#]+)
这里$ 1将是你的协议(http或https),$ 2将是链接ex的其余部分。 something.com?i=1
答案 1 :(得分:1)
它说,匹配字符串或字符串的一部分
http
或https
://
[a-zA-Z0-9]
,/
,%
,.
,-
,?
,{{ 1}},&
,=
或!
将其替换为#
现在,它会匹配所有网址吗?不,大多数情况下,但不是全部。它会匹配<a href='MATCHED_STRING' target='_blank'>MATCHED_STRING</a>
,理想情况下,您可能希望设置一个单词边界谎言my name is boxiehttp://random
[删除误导性评论]
答案 2 :(得分:1)
replaceAll
是一个String
类方法,匹配Regex
并将其替换为参数化字符串。参数(如$0
)是匹配索引。
您的regex
应该匹配所有网址并将其转换为锚标记,但我建议您做一些改进:
在正则表达式中,您使用的是(?:https?|http?)
。 (?:SOMETHING)
与非捕获组匹配,?
使前一个字符可选(因此它与http
和htt
匹配。)
您可以使用https?
代替。
通常没有必要在正则表达式类中转义字符(如-
或&
)。
所以regex将是:
.replaceAll("https?://[\\w/%.-?&=!#]+", "<a href='$0' target='_blank'>$0</a>");
答案 3 :(得分:1)
您应该一步一步地理解这一点:
(?:https?|http?)
|
- &gt;表示OR,因此表示匹配https或http
?
- &gt; (仅此处)表示可选元素,https中的“s”是可选的,或者来自http的“p”也是可选的。您可能想要做的是:“(https)?|(http)?
”,使每个可选。但这仍然是错误的,因为你可以匹配像这样的字符串:“://someLink
” - 这没有意义。
我想你想要匹配https或http,因此你的正则表达式需要更改为:
https? (to make only the s optinal)
?:
- &gt;它定义了一个非捕获组(这意味着它将匹配但不存在于输出中 - 未在结果中捕获),这与正则表达式组相关。
()
- &gt;意味着这是一个群体
事实上,这是第二组(第一组是整场比赛)
上面已经解释了这个正则表达式“://[\\w/%.\\-?&=!#]+
”我觉得很好。
以下是“魔术”:“$0
”,这称为对匹配组的反向引用。所以在你的消息String中,你与正则表达式匹配的结果是:
(?: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);
答案 4 :(得分:0)
我不知道java正则表达式。 但我试着用javascript解释正则表达式。
(?:https?|http?)
:http或https,好吧,如果不存在的话。 (?:...)表示没有内存分配。只是通过。
://
:这是与“://”相同的字符
[\\w/%.\\-?&=!#]+
:这是正则表达式类,
\\w
:所有角色,(javascript应为'\ w'
允许使用/, %, \, -, ?, &, =, !, #
个字符
+
表示一个[]或更多[]。
和
$0
:返回整个匹配的地址部分,不包括“http”或“https”(javascript以索引1开头)。