2013-03-22 1 views
2

문자와 공백을 제외하고 모든 것을 던지려고 노력하고 있습니다 [0-9] {1,3} 점 앞과 [0-9 ] {1,2}를 표시합니다.정규식 문자 만 공백과 특정 유형의 소수 자릿수를 유지

내가 자바

replaceAll("[^\\p{L}\\s(\\s[0-9]{1,3}(\\\\.[0-9]{1,2})?)]", "+")); 

에두고 왔어요 난 정말이 동작하지 않습니다. 나는 정규식에 관해서는 진짜 초보자이다.

: 12.5 MPLA MPLA 121.22 MPLA 1.52 MPLA 1 MPLA 1,000 MPLA 1000.12 mpla12.5

반환 : 12.5 MPLA MPLA 121.22 MPLA 1.52 MPLA MPLA + 1 + MPLA +

// 내가 sNUMBER \의

\ 의 포맷을 원하기 때문에이 너무 원하지 않는 mpla12.5에 특별한주의3210
+2

몇 가지 예/테스트 사례를 제공해 줄 수 있습니까? – arshajii

+0

죄송합니다. 나는 예제를 추가했다. 나는 그것이 지금 꽤 분명하다고 생각한다. – alkis

답변

3

그냥 메모를, 정규 표현식에 문자 클래스의 외부에 "없다"의미 작업을 수행하기위한 정말 좋은하지 않습니다. 그래서, 당신이 무엇에 집중 제안 그에서 결과를 유지하고 구축하려는 :

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 

주석에 언급 된 사례를 처리해야합니다. 대부분의 경우 매우 복잡한 정규 표현식은 코드 냄새이며, 일반적으로 문제를 해결하는 더 간단한 방법이 있습니다.

+0

거의 다 왔어요. 정수 또는 10 진수가되고 싶습니다. 나는 이것이 그것을해야한다고 생각한다. 무늬.compile ("[A-Za-z] + | \\ s (\\ d {1,3} (\\. \\ d {1,2})? \\ s)?"); . 수락 할 수 있도록 게시물을 수정하십시오. 그리고 당신이 시간이 걸릴 수 있다면, "정규 표현식은"문자 클래스 밖의 의미론 "이 아닌"행할 때 정말 좋지 않습니다 "라는 주제에 대해 자세히 설명하십시오. 내가 언급 한대로 나는 초보자이다. 도움 주셔서 감사합니다. – alkis

+0

@alkis 감사합니다. 답변을 업데이트했습니다. – ach

+1

첫 번째 그룹이 숫자 인 경우 건너 뜁니다. ''12.5 mpla 12.5 ... "'. 나는 또한'mpla12.5'에서'mpla'를 추출 할 것입니다, 그것을 무시하지 않을 것입니다. – Dukeling

0

이 밖으로 시도 :

 String data = "ds#@234f&^%%sd232.ertre3df6g#@$566"; 
    String replaceString = data.replaceAll("[^\\w\\s\\.]", ""); 

    System.out.println(data); 

    String firstPart = replaceString.split("\\.")[0]; 

    String secondString = "."+ replaceString.split("\\.")[1]; 


    String finalString = firstPart + secondString.replaceAll("[^\\d\\.]", ""); 
    System.out.println(finalString); 
+0

예제를 추가했습니다. 혼란에 빠져서 내가 원하는 것을 더 분명히했습니다. – alkis

관련 문제