2016-11-06 2 views
1

:/ 많이 포함하여 긴 문자열이 있습니다. 그것은 또한 URL을 포함합니다.Java 정규식 대체 : 및 공백을 URL에 도메인 이름 제외/

나는 공백에 URL의 모든 :/하지만 도메인 이름 (예를 들어, http://example.com) 대체합니다.

따라서 link:http://example.com/test/page.htmlurl http://example.com test page.html이됩니다.

시도했지만 :/http://example.com 공백으로 바꿉니다. 당신은 하나의 맥락에서 어떤 패턴을 유지와 다른 뭔가로 대체해야하기 때문에

+0

교체 또는 제거 하시겠습니까? –

+0

예제와 같이 공백으로 바꿉니다. – Alisa

+0

'url : http : // example.com // foo/bar'에 대해 코드가 어떻게 반응해야합니까? – Pshemo

답변

3

지금은 보인다.

따라서 / 또는 :을 찾아서 공백으로 교체하려고 시도합니다. 이러한 문자 앞에 http://address 부분이 있으면 자체로 대체됩니다.

2

, 당신은 일치 캡처의 URL (당신이 "보호"할 것을) 그냥 당신이 무엇을 일치하는 정규 표현식을 사용할 수 있습니다 제거해야합니다. 그런 다음 Matcher#appendReplacement()을 사용하여 캡처가 수행되었는지 확인한 다음 적절하게 교체하십시오. (\\bhttps?://) 일치하고 http:// 또는 https://[:/] 일치하거나 또는 :/은 (a 공간으로 대체 함) 그룹 1으로 캡처 여기서

정규식은 (\\bhttps?://\\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 

Java demo를 참조하십시오 여기에

은 샘플 코드입니다.

url = url.replaceAll("(https?://[^/:]+)?[/:]", "$1 ") 

$1? 덕분에 선택 사항입니다 그룹 1 (https?://[^/:]+)에서 일치를 나타냅니다 : 당신은 같은 것을 사용할 수 있습니다처럼 들어

+0

이것이 원하는 결과를 얻는 방법을 모르겠습니까? 내가 실행할 때, "http://example.com//foo/bar 1 2" –

+0

@MichaelMarkidis 당신 말이 맞습니다. '/ fo/bar'를'fo bar'로 대체하지 않습니다. – Alisa

+0

"fo/bar를 fo bar로 바꾸지 않는다"는 것은 무엇을 의미합니까? 그럴까요? http://ideone.com/lzACQw –