2012-12-06 3 views
4

'.', '?'및 '!'과 같은 문장 터미네이터의 모든 인스턴스를 바꾸려고하는데 '닥터'와 같은 문자열을 바꾸지 않습니다. 및 "미스터".자바 대체 정규식 제외와 함께

text = text.replaceAll("(?![mr|mrs|ms|dr])(\\s*[\\.\\?\\!]\\s*)", "\n");

를 ... 그러나 그것은 작동하지 않습니다

나는 다음과 같은 노력했다. 모든 제안을 부탁드립니다.


편집 : 여기에 피드백을 보내고이 문제를 해결하면 문제가 해결됩니다.

private String convertText(String text) { 
    text = text.replaceAll("\\s+", " "); 
    text = text.replaceAll("[\n\r\\(\\)\"\\,\\:]", ""); 
    text = text.replaceAll("(?i)(?<!dr|mr|mrs|ms|jr|sr|\\s\\w)(\\s*[\\.\\?\\!\\;](?:\\s+|$))","\r\n"); 
    return text.trim(); 
} 

코드는 모든 문장 부호와 관계없는 공백을 제거, 텍스트의 발췌에서 모든 * 화합물 및 단일 문장을 추출합니다.
*

+0

'(?! mr | mrs | ms | dr)'예외 목록에서 대괄호'[]'를 제거해보십시오. 그들은 당신이 그들을 사용하고있는 것처럼 "전체 문자열"이 아니라 "문자 집합"을 의미합니다. 그것이 당신의 문제를 완전히 해결할 지 모르지만 시작 가치가있다. – newfurniturey

+0

그래도 그것을 시도하는 데 몇 가지 문제점이있다. 'J.와 같은 순서를 어떻게 처리 할 것인가? H. 호나우두는 기차가 정각에 달리고 있다고 말합니다. 맞습니까? " – Anthill

+0

@Anthill, 필자는 마침표 앞에 나오는 단일 문자를 무시하는 지원을 추가했습니다. 이것이 올바른 방법인가요? 더 쉬운 방법이 있습니까? –

답변

2

당신은 또한 mr/dr/ms/mrs 목록 내부 문자 클래스 안이

String x = "dr. house."; 
System.out.println(x.replaceAll("(?<!mr|mrs|ms|dr)(\\s*[\\.\\?\\!]\\s*)","\n")); 

같은 부정적인 lookbehind 대신에 부정적 예측을 사용해야합니다.

+0

나는 너무 가까웠다. 나는 막연하게 부정적인 표정을 기억한다. 감사. –

+0

안녕하십니까. –

-1

당신은 .을 선행 할 수있는 문자 조합의 전체 목록을 가질 필요 해요 ... 몇 가지 예외가있다. 그런 다음 dr.mr. (및 기타 허용되는 콤보)을 dr28dsj458sjmr28dsj458sj과 같은 고유 한 것으로 바꿀 수 있습니다. 이상적으로는 임시 대체 값이 문서의 다른 곳에 존재하지 않는지 확인해야합니다. 그런 다음 모든 문장 종료자를 제거한 다음 다시 시도하고 28dsj458sj의 발생을 .으로 다시 바꿉니다.

+0

나는이 해킹 해결 방법이 좋지만 성능이 저하 될 수 있습니다. 부정적 시각은 내가하려는 일이었다. 시간 내 줘서 고마워. –