2017-01-20 21 views
1

Markdownのようなテキストでは、正確に3つのダッシュ(---)をemdashエンティティに置き換えたいが、4つのダッシュを置き換えたくない。ダッシュの正確な数を一致させるJavaの正規表現

これを正規表現として書くにはどうすればよいですか?

私はこの試みた:

String input = "--- This---example----and--another.---"; 
String expected = "— This—example----and--another.—"; 
assertEquals(expected, input.replaceAll("-{3}", "—")); 

をしかし、それは私を与える:

 
— This—example—-and--another.— 

代わりに私が何をしたいの:3つのダッシュで表示されたときに

 
— This—example----and--another.— 

が、私はそれが仕事をしたいです行の先頭または末尾にのいずれかの文字が含まれています。ダッシュ記号より)—、つまり、英数字で囲まれたときだけではありません。

答えて

6

使用前後参照のみ3ダッシュが一致していることを確認する:

input.replaceAll("(?<!-)-{3}(?!-)", "&#8212;") 

regex demo

(?<!-)否定後読み-が3つのダッシュの前にしたら試合を失敗し、(?!-)ます参照してください。 負のルックアヘッドは、3つのダッシュの後に-がある場合、マッチに失敗します。

+0

男ああ、私もそれらのゼロ幅の先読み/後読み構文については知りませんでした。どうもありがとう! –

-1

あなたは3つのダッシュ周りの文字は別のものであってはならないということを伝えることができます。

replaceAll("[^-]-{3}[^-]", ...)

+0

これは前の文字と次の文字も一致するため、置き換えのコンテキストでは使用できません。 – Aaron

+0

この(1)*は '---'の前後に非ダッシュが存在することを必要とするため、 '---'が文字列の先頭または末尾に置かれると失敗し、(2)これは 'a --- b --- c'のような他の問題を引き起こす可能性があります。ここで' b'は 'a --- b 'で取り除かれますので、' b-- -c'。 – Pshemo

関連する問題