2009-06-16 10 views
0

Java 속성 형식으로 속성을 포함하는 config.properties 파일이 있습니다. 알려진 값의 속성 값을 새 값으로 바꿔야합니다. 파일의 주석과 형식은 보존되어야합니다.RegEx를 사용하여 속성 값 바꾸기

내 현재 접근법은 RegEx를 사용하여 속성 이름을 일치시킨 다음 그 값을 대체하는 것입니다. 그러나 Java Properties는 여러 줄 값을 지원하며 시간이 맞지 않습니다.

다음은 예입니다. 내가 "3"과 재산 A의 값을 대체하려는

# A property 
A = 1\ 
    2 

# B property 
B = 2 

: 가정하자 config.properties 다음과 같은 텍스트가 포함되어 있습니다. 최종 결과는 같아야합니다

# A property 
A = 3 

# B property 
B = 2 

나의 현재 정규식 (?s)(A[\\s]*=[\\s]*)(.*)가 제대로 작동하지 않습니다.

RegEx를 제안하거나 다른 방법으로 제안하십시오.

감사합니다.

답변

1

이 시도 :

String regex = "(?m)^(A\\s*+=\\s*+)" 
    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$"; 

쓴대로 첫 번째 부분을 남겨두고 값을 일치시키는 데 집중할 수있었습니다. 키와 구분 기호를 관리하는 규칙은 실제로는 훨씬 복잡합니다.

이 값은 캐리지 리턴, 줄 바꿈 또는 백 슬래시를 제외한 모든 문자로 구성되거나 백 슬래시 뒤에 줄 구분 기호 나 줄 바꿈 기호가없는 문자로 구성됩니다. 줄 분리 기호는 DOS/Windows (\r\n), Unix/Linux/OSX (\n) 또는 pre-OSX Mac (\r)의 세 가지 형식 중 하나 일 수 있습니다.

정규식은 라인 앵커가 작동 할 수 있도록 다중 줄 모드이지만 단일 라인 (DOTALL) 모드가 아닙니다. 나는 또한 역 추적이 결코 유용하지 않을 것이기 때문에 소유욕을 사용했다.

1

Java에서 속성 파일을로드, 읽기, 수정 및 저장하는 도구가 있습니다.

개인적으로 나는 Jakarta Commons Configuration을 좋아합니다.

+0

확실히 더 나은 접근 방법입니다. – slipset

+0

필요에 따라 주석과 서식을 그대로 유지합니까? –

0

자카르타 커먼 환경 설정을 사용하는 streetpc에 동의합니다.

그러나 정규식에 집중하기 위해 문제는 대부분의 정규식 엔진이 기본적으로 줄 단위로 작동한다는 것입니다.

[m]/pattern/[i][m][s][x] 

는 M 접두사는 선택 사항이며 옵션은 옵션 후행의 의미 :

제 (아주 오래된) Perl5Util 클래스의 예를 들어 당신이 패턴 구문 다음과 같은 것을 읽을 수 있습니다 (http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.html 참조)

 
i case insensitive match 
m treat the input as consisting of multiple lines 
s treat the input as consisting of a single line 
x enable extended expression syntax incorporating whitespace and comments 
+0

/m 및/s 한정자의 이름이 잘못되었습니다. 그들이하는 일은 '^', '$'및 '.'의 동작을 변경하는 것입니다. 메타 문자. regex를 한 번에 한 줄씩 또는 전체 파일에 적용할지 여부는 전적으로 귀하에게 달려 있습니다. –

관련 문제