这个正则表达式是什么意思.检查http或https超链接就足够了吗

What does this regular expression mean. Is it enough to check http or https hyperlinks?

本文关键字:超链接 https 正则表达式 是什么 意思 http 检查      更新时间:2023-09-26

有人能提供建议吗?替换所有方法是如何工作的?

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)匹配非捕获组,?使前一个字符可选(因此它匹配httphtt。)

    您应该使用https?

  • 正则表达式类中通常不需要转义字符(如-&)。


因此正则表达式为:

.replaceAll("https?://[''w/%.-?&=!#]+", "<a href='$0' target='_blank'>$0</a>");

它说,与的字符串或字符串的一部分匹配

  1. 具有httphttps
  2. 然后是://
  3. 后面跟一个或多个字字符[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开头)。