排除正则表达式中的网址格式

时间:2017-03-20 18:30:20

标签: java regex pattern-matching url-pattern

这是我的输入字符串

<div>http://google.com</div><span data-user-info="{\"name\":\"subash\", \"url\" : \"http://userinfo.com?userid=33\"}"></span><a href="https://contact.me"></a>http://byebye.com is a dummy website.

对于这种情况,我只需要匹配http的第一次和最后一次出现。因为那些是html观点的innerText。我们需要忽略属性值中的http。我建立了以下正则表达式。

(?<!href=\"|src=\"|value=\"|href=\'|src=\'|value=\'|=)(http://|https://|ftp://|sftp://)

它适用于第一次和最后一次。但这也匹配第二次出现的http。我们不需要匹配的属性中的链接(http)。

仅供参考:我正在尝试消极的前瞻,但这似乎没有帮助。这是一个负向前瞻的人。

(?<!href=\"|src=\"|value=\"|href=\'|src=\'|value=\'|=)(http://|https://|ftp://|sftp://).*?(?!>)

1 个答案:

答案 0 :(得分:0)

有更多详细信息后更新

另一种方法是从正则表达式&#34;贪婪&#34;中受益。 /(http).*(http)/g将从&#34; http&#34;的第一个到最后一个匹配项尽可能多地匹配文本。下面的示例说明了此行为。 (http)正在捕获群组 - 用完整的正则表达式替换它们。我简化了正则表达式以便于理解。

var text ='<div>http://google.com</div><span data-user-info="{\"name\":\"subash\", \"url\" : \"http://userinfo.com?userid=33\"}"></span><a href="https://contact.me"></a>http://byebye.com is a dummy website.'
var regex = /(http).*(http)/g;
var match = regex.exec(text);
//match[0] is entire matched text
var firstMatch = match[1]; // = "http"
var lastMatch = match[2]; // = "http"

此示例特定于JavaScript,但Java regexps(以及许多其他正则表达式引擎)以相同的方式工作。 (http).*(http)也可以。

您的目标是匹配第一行和最后一行,还是第一次和最后一次出现的字符串?

如果前者是正确的,我会首先将文本拆分为行,然后将正则表达式匹配第一行和最后一行。

//Split into lines:
var lines = yourMultiLineText.split(/[\r\n]+/g);

如果后者是正确的,找到所有与你的基本模式的匹配,并从匹配数组中取第一个和最后一个,例如:

//Match using a simpler regex
var matches = yourMultiLineText.match(yourRegex);
//Store the result here
var result;
//Make sure that there are at least 2 matches in total for this to make sense.
if(matches.length > 1){
   //Grab the first and the last match.
   result = [matches[0], matches[matches.length - 1]];
} else {
   result = [];
}