Java 排除正则表达式中的url模式

Java 排除正则表达式中的url模式,java,regex,pattern-matching,url-pattern,Java,Regex,Pattern Matching,Url Pattern,这是我的输入字符串 http://google.comhttp://byebye.com 是一个虚拟网站。 对于这种情况,我只需要匹配http的第一次和最后一次出现。因为从html的角度来看,这些是innerText。http中的属性值需要忽略。我构建以下正则表达式 (?<!href=\"|src=\"|value=\"|href=\'|src=\'|value=\'|=)(http://|https://|ftp://|sftp://) (? 它在第一次和最后一次出现时都可以正常工作。

这是我的输入字符串

http://google.comhttp://byebye.com 是一个虚拟网站。

对于这种情况,我只需要匹配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://).*?(?!>)
(?)
获得更多详细信息后更新

另一种方法是利用正则表达式的“贪婪性”。
/(http)。*(http)/g
将从“http”的第一次出现到最后一次出现匹配尽可能多的文本。下面的示例说明了这种行为。
(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"
如果后者是正确的,则查找与基本模式的所有匹配项,并从匹配项数组中选择第一个和最后一个,例如:

//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 = [];
}
获得更多详细信息后更新

另一种方法是利用正则表达式的“贪婪性”。
/(http)。*(http)/g
将从“http”的第一次出现到最后一次出现匹配尽可能多的文本。下面的示例说明了这种行为。
(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"
如果后者是正确的,则查找与基本模式的所有匹配项,并从匹配项数组中选择第一个和最后一个,例如:

//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 = [];
}

哦,我的错,为了澄清,我说了很多行。实际上它是一个单行字符串。抱歉,我会更新这个问题correctly@subash,在这种情况下,我会选择最初描述的第二种方法或另一种建议-请参阅我的更新答案。谢谢你的建议。我会尝试一下,让你知道哦,我的错,为了澄清,我说了很多行。实际上它是一个单行字符串。对不起,我会更新这个问题correctly@subash,在这种情况下,我会选择最初描述的第二种方法或另一种建议-请参阅我的更新答案。谢谢你的建议。我会尝试一下,让你知道链接不是为了指向解决方案,但显示您使用两种不同的语言标记了问题(我看到您现在已更正)。无论如何,您的问题有点不清楚(至少对我来说)。“我只需要匹配http的第一次和最后一次出现”为此,我们可以使用String类中的
indexOf
lastIndexOf
方法,不需要regex.yes。问题是我们需要忽略http内部属性。例如上面的第二个和第三个http内部属性值。我们只需要匹配html InnerText。那么,您的目标查找链接是否不是html属性?如果是,请确定你真的想只找到第一个和最后一个,还是想找到所有这样的链接?@Pshemo所有这样的链接我会避免使用带有HTML()的正则表达式。相反,我们可以使用像jsoup这样的HTML解析器来解析HTML并提取它所代表的文本(这将去掉HTML标记),类似:。然后我们可以安全地使用正则表达式提取链接,如所述:链接不是指向解决方案,而是显示您使用两种不同的语言标记了您的问题(我看到您现在已更正)。无论如何,您的问题有点不清楚(至少对我而言)。“我只需要匹配http的第一次和最后一次出现。”为此,我们可以使用String类中的
indexOf
lastIndexOf
方法,不需要regex.yes。问题是我们需要忽略http内部属性。例如上面的第二个和第三个http内部属性值。我们只需要匹配html InnerText。那么,您的目标查找链接是否不是html属性?如果是,请确定你真的想只找到第一个和最后一个,还是想找到所有这样的链接?@Pshemo所有这样的链接我会避免使用带有HTML()的正则表达式。相反,我们可以使用像jsoup这样的HTML解析器来解析HTML并提取它所代表的文本(这将去掉HTML标记),类似:。然后我们可以安全地使用正则表达式提取链接,如所述: