그냥 메모를, 정규 표현식에 문자 클래스의 외부에 "없다"의미 작업을 수행하기위한 정말 좋은하지 않습니다. 그래서, 당신이 무엇에 집중 제안 그에서 결과를 유지하고 구축하려는 :
String s = "mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla 1000 mpla 1000.12 mpla12.5";
Pattern p = Pattern.compile("[A-Za-z]+|\\s(\\d{1,3}(\\.\\d{1,2})?\\s)?");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
sb.append(m.group());
}
System.out.println(sb.toString());
출력을 :
mpla 12.5 mpla 121.22 mpla 1.52 mpla mpla mpla mpla
내가이 당신이에서를 요구하고 무엇이라고 생각 가장 엄격한 의미 - 결과에 여러 개의 공백이 있으면 원하는 경우 살균해야합니다.
편집 : 내 말은 regexes are not really good for doing "not" semantics outside of character classes
입니다. 문자 또는 공백 문자가 아닌 문자를 일치시키려는 경우에는 부정 문자 클래스 인 [^A-Za-z\\s]
으로 쉽게 처리 할 수 있습니다. 그러나 다중 문자 그룹화 (예 : \\d{1,3}\\.\\d{1,2}
)의 부정을 시작하면 추악 해집니다. 당신은 기술적으로 부정적인 선견지명을 사용하여 그것을 할 수 있습니다, 그러나 그것은 매우 직관적이지 않은 kludgy입니다. 이 포스팅은 잘 설명 : https://stackoverflow.com/a/406408/1311394
편집 2 : 귀하의 의견을 바탕으로, 나는 정규식 매칭과 함께 String.split()
을 활용하는 솔루션 당신이 원하는 일을 할 것이라고 믿는다 훨씬 쉽게 :
String s = "12.5 mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla 1000 mpla 1000.12 mpla12.5";
StringBuilder sb = new StringBuilder();
for (String token : s.split("\\s+")) {
if (token.matches("[A-Za-z]+|\\d{1,3}(\\.\\d{1,2})?")) {
sb.append(token).append(" ");
}
}
System.out.println(sb.toString());
출력 :
12.5 mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla mpla
주석에 언급 된 사례를 처리해야합니다. 대부분의 경우 매우 복잡한 정규 표현식은 코드 냄새이며, 일반적으로 문제를 해결하는 더 간단한 방법이 있습니다.
출처
2013-03-22 14:09:33
ach
몇 가지 예/테스트 사례를 제공해 줄 수 있습니까? – arshajii
죄송합니다. 나는 예제를 추가했다. 나는 그것이 지금 꽤 분명하다고 생각한다. – alkis