2016-11-06 7 views
1

私は:/のロットを含む長い文字列を持っています。また、URLも含まれています。Java Regexを置き換えてください:URLの空白を含むドメイン名を除いて

すべてを:/に置き換えますが、URLの空白のドメイン名(たとえば、http://example.com)を置き換えます。

従ってlink:http://example.com/test/page.htmlurl http://example.com test page.htmlになります。

私はreplaceAll("[://]", " ")を試しましたが、の空白には:/を置き換えました。

+0

交換するか取り外しますか? –

+0

例のように空白に置き換えてください。 – Alisa

+0

'url:http:// example.com // foo/bar'のコードはどのように反応するのですか? – Pshemo

答えて

3

は今それが見えます。

したがって、/または:を見つけようとし、スペースで置き換えようとします。これらの文字の前にhttp://addressの部分がある場合は、それ自体で置き換えられます。

2

使用すると、1つのコンテキストでのいくつかのパターンを維持し、他で何か他のものと交換する必要があるので、あなたはのURL(およびあなたが「保護」したいもの)と一致してキャプチャするために正規表現を使用することができますし、まさにあなたにマッチ削除する必要があります。次に、キャプチャが行われたかどうかを確認するためにMatcher#appendReplacement()を使用し、それに応じて適切な置換を使用してください。

正規表現は(\\bhttps?://)マッチとグループ1http://又はhttps://、及び[:/]マッチ:又は/のいずれか(スペースで置換される)中に取り込み(\\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 –

関連する問題