2012-02-15 5 views
1

여러분, 제 두뇌가 튀겨 요. 혼자 올바른 이미Java replace 모든 정규식 유사 검색어

--Boundary_([ThisOneWasFine])-- 

라인을 유지하면서, 더 적절한

--Boundary_([ArbitraryName])-- 

선으로 잘못된

--Boundary_([ArbitraryName]) 

라인을 대체하여 나쁜 경계 일부 발광층을 해결하기 위해 노력하고 있습니다. 나는 전체 메시지를 메모리 (String)로 가지고있다. (예, 추악하다. 그러나 이것들을 분석하려고하면 JavaMail이 죽는다.) replaceAll을하려고한다. 여기 내가 얻을 수있는 가장 가까운 곳이 있습니다.

//Identifie bondary lines that do not end in -- 
String regex = "^--Boundary_\\([^\\)]*\\)$"; 
Pattern pattern = Pattern.compile(regex, 
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
Matcher matcher = pattern.matcher(targetString); 
//Store all of our unique results. 
HashSet<String> boundaries = new HashSet<String>(); 
while (matcher.find()) 
    boundaries.add(s); 
//Add "--" at the end of the Strings we found. 
for (String boundary : boundaries) 
    targetString = targetString.replaceAll(Pattern.quote(boundary), 
     boundary + "--"); 

이 그러나

--Boundary_([WasValid])---- 

으로 유효한

--Boundary_([WasValid])-- 

라인을 모두 교체의 명백한 문제가있다, 이것은 심지어 교체를 수행하기 위해 왔 유일한 설정입니다 . Pattern.quote (경계)를 Pattern.quote (경계) + "$"로 변경하려고하면 아무 것도 대체되지 않습니다. 두 개의 루프 대신 matcher.replaceAll ("$ 0--")을 사용하려고하면 아무 것도 대체되지 않습니다. 내 목표를 달성하는 우아한 방법은 무엇이며 왜 효과가 있습니까?

String regex = "^--Boundary_\\([^\\)]*\\)(--)?$"; 

다음 문자열이 --로 끝나는 경우보고하지 않는 유일한 사람을 대체 :

답변

1

find()와 일치를 반복 할 필요는 없습니다. 그건 replaceAll()의 일부입니다.

s = s.replaceAll("(?im)^--Boundary_\\([^\\)]*\\)$", "$0--"); 

대체 문자열의 $0는 정규식이 반복에서 일치하는 어떤 자리 표시 자입니다.

정규식 시작 부분에있는 (?im)은 CASE_INSENSITIVE 및 MULTILINE 모드를 사용합니다.

+0

감사합니다; 이전에 $ 0에서 시도한 적이 없었지만 트릭을 수행했습니다. 지금은 제외하고 나는 내 머리를 아프게 긁어 모으는 방법을 모르겠다. 그러나 나는 극도로 피곤한 것을 피우고 이것을 끝내라고 말한다. 이 것을 가장 우아하고 잘 설명 된 것으로 받아들이십시오 (그러나 감사합니다, 다른 모든 사람들). –

0

당신은 이런 식으로 뭔가를 시도 할 수 있습니다.

0

가정 모든 문자열이 행에있는이 작동합니다 "(?im)^--Boundary_\\([^)]*\\)$"

스크립트 예 :

String str = "--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n"; 
System.out.println(str.replaceAll("(?im)^--Boundary_\\([^)]*\\)$", "$0--")); 

편집 : 자바 스크립트 변경, 너무 빨리 읽기 권한이 있어야합니다 (감사합니다. 그것을 지적하기 위해)

+0

JavaScript 스크립팅 엔진을 사용 하시겠습니까? –