Java Regex replace:和/除了url中的域名以外的空白

Java Regex replace:和/除了url中的域名以外的空白,java,regex,url,Java,Regex,Url,我有一个长字符串,包括很多:和/。它还包括URL 我想替换所有的:和/,但要替换域名(例如http://example.com)将url的链接设置为空白 所以链接:http://example.com/test/page.html将成为链接http://example.com 测试页面.html 我尝试了replaceAll(“[://]”,“”),但它也替换了中的:和/http://example.com到空白处。由于您需要在一个上下文中保留某些模式,并在另一个上下文中替换为其他模式,因此您可

我有一个长字符串,包括很多
/
。它还包括URL

我想替换所有的
/
,但要替换域名(例如
http://example.com
)将url的链接设置为空白

所以
链接:http://example.com/test/page.html
将成为
链接http://example.com 测试页面.html


我尝试了
replaceAll(“[://]”,“”)
,但它也替换了
中的
/
http://example.com
到空白处。

由于您需要在一个上下文中保留某些模式,并在另一个上下文中替换为其他模式,因此您可以使用正则表达式来匹配和捕获URL(以及您想要“保护”的任何内容)只需匹配需要删除的内容。然后,使用
Matcher#appendReplacement()
检查捕获是否发生,并相应地使用适当的替换

正则表达式可以类似于
(\\bhttps?:/\\S*)|[:/]
,其中
(\\bhttps?:/)
匹配并捕获到组1a
http://
https://
,并且
[://]
匹配
(用空格代替)。如果需要“收缩”
/
s,请使用
[:/]+

下面是一个示例代码:

String fileText = "http://example.com//foo/bar http://example.com//foo/bar  1: 2/";
String pattern = "(\\bhttps?://)|[:/]";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    if (m.group(1) != null)
        m.appendReplacement(sb, m.group(1));
    else
        m.appendReplacement(sb, " ");
}
m.appendTail(sb);
System.out.println(sb);
// => http://example.com  foo bar http://example.com  foo bar  1  2

请参阅。

因为您需要在一个上下文中保留一些模式,并在另一个上下文中替换为其他模式,所以您可以使用正则表达式来匹配和捕获URL(以及您想要“保护”的任何内容),只需匹配您需要删除的内容即可。然后,使用
Matcher#appendReplacement()
检查捕获是否发生,并相应地使用适当的替换

正则表达式可以类似于
(\\bhttps?:/\\S*)|[:/]
,其中
(\\bhttps?:/)
匹配并捕获到组1a
http://
https://
,并且
[://]
匹配
(用空格代替)。如果需要“收缩”
/
s,请使用
[:/]+

下面是一个示例代码:

String fileText = "http://example.com//foo/bar http://example.com//foo/bar  1: 2/";
String pattern = "(\\bhttps?://)|[:/]";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    if (m.group(1) != null)
        m.appendReplacement(sb, m.group(1));
    else
        m.appendReplacement(sb, " ");
}
m.appendTail(sb);
System.out.println(sb);
// => http://example.com  foo bar http://example.com  foo bar  1  2

请参阅。

现在,您可能需要使用以下内容:

url = url.replaceAll("(https?://[^/:]+)?[/:]", "$1 ")
$1
表示组1
(https?:/[^/:]+)
中的匹配项,由于
是可选的


因此,它将尝试查找任何
/
,并用空格替换它。如果在这些字符之前有
http://address
部分它将被自己替换。

现在看来,您可能需要使用类似于:

url = url.replaceAll("(https?://[^/:]+)?[/:]", "$1 ")
$1
表示组1
(https?:/[^/:]+)
中的匹配项,由于
是可选的



因此,它将尝试查找任何
/
,并用空格替换它。如果在这些字符之前有
http://address
部分它将被自己替换。

替换或删除?替换为空白,如示例所示。您的代码对
url的反应如何:http://example.com//foo/bar
?为什么不使用
replaceFirst()
?它应该给出
urlhttp://example.com  foo bar
Replace或remove?替换为空白,如示例所示。您的代码对
url的反应如何:http://example.com//foo/bar
?为什么不使用
replaceFirst()
?它应该给出
urlhttp://example.com  foo bar
我看不出这是如何产生预期结果的?当我运行它时,我得到“12”@MichaelMarkidis你是对的。它不会将
//fo/bar
替换为
fo-bar
。您所说的“不会将//fo/bar替换为fo-bar”是什么意思?应该吗?看,我明白了,在编辑之前,我的答案是100%正确的,现在,它也是正确的,但是Pshemo的方法更简洁。@WiktorStribiżew你的答案现在是100%正确的,但是在编辑之前,模式是
“(\\bhttps?://\\s*)[://]”,它没有取代
///foo/bar
foo-bar
。不管怎样,谢谢。我不知道这是怎么得到想要的结果的?当我运行它时,我得到“12”@MichaelMarkidis你是对的。它不会将
//fo/bar
替换为
fo-bar
。您所说的“不会将//fo/bar替换为fo-bar”是什么意思?应该吗?看,我明白了,在编辑之前,我的答案是100%正确的,现在,它也是正确的,但是Pshemo的方法更简洁。@WiktorStribiżew你的答案现在是100%正确的,但是在编辑之前,模式是
“(\\bhttps?://\\s*)[://]”,它没有取代
///foo/bar
foo-bar
。无论如何,谢谢你。