2010-06-02 4 views
8

자바 소스 코드에서 문자열 리터럴을 일치시키는 정규 표현식을 찾고 있습니다.Java 문자열 리터럴을 올바르게 일치 시키십시오.

가능합니까?

private String Foo = "A potato"; 
private String Bar = "A \"car\""; 

내 의도는 다른 문자열 내의 모든 문자열을 다른 것으로 대체하는 것입니다. 사용 :

String A = "I went to the store to buy a \"coke\""; 
String B = A.replaceAll(REGEX,"Pepsi"); 

이와 비슷한 것.

+0

예. 이후의 내용을 더 잘 설명 할 수있는 소스 코드 조각을 제공 할 수 있습니까? – Wangnick

답변

4

좋아 의견. 그래서 당신이 원하는 것은 문자열 내에서 큰 따옴표로 시작하고 끝나는 일련의 문자를 검색하는 것입니다.

String bar = "A \"car\""; 
    Pattern string = Pattern.compile("\".*?\""); 
    Matcher matcher = string.matcher(bar); 
    String result = matcher.replaceAll("\"bicycle\""); 

욕심이없는 .*? 패턴에 유의하십시오.

+1

String 내의 String에도 따옴표가 있으면 어떻게 될까요? –

+0

예. 그 때 무엇. 어떻게 끝나는 지 어떻게 알 수 있습니까? 이 경우에는 내부 문자열의 따옴표가 외부 문자열을 구성 할 때 이스케이프 처리되고 교체 문자열에서 처리 한 다음 필요한 경우 다시 이스케이프 처리해야합니다. 따옴표를 이스케이프 처리하는 한 가지 방법은 예를 들어 따옴표를 두 번 사용하는 것입니다. – Wangnick

+0

큰 따옴표를 사용하여 이스케이프 처리하면 정규 표현식이 까다로워집니다. 더 좋은 방법은 아마도 다른 문자를 정의하여 이스케이프 (예 : HTML에서 & like)를 도입 한 다음 해당 문자의 모든 이스케이프를 이스케이프 처리하는 것입니다. – Wangnick

1

Java 용 파서 생성기와 StringLiteral 문법 요소에 대한 정규 표현식을 볼 수 있습니다. 여기

example from ANTLR입니다 :

StringLiteral 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 
+0

당신이'// hello "잡기를 피하기를 원할 것 같아요. – aioobe

+0

저는 대부분의 자바 컴파일러가 주석을 사전 처리하고 그 밖의 모든 것을 찾는다는 인상하에 항상 사용되었습니다. 그러나 나는 이것에 대해 틀릴 수도 있습니다. – Uri

+0

이 답변의 문제점은 문법에 익숙하지 않다는 것입니다. –

-1

당신은 (펄 나오지 텍스트 편집기 CTRL-F 등 등?) 당신의 발견을 위해 사용중인 툴 말을하지 않습니다. 그러나 일반적인 정규식은 다음과 같습니다

\".*?\" 

편집 :이 빠른 & 더러운 대답, 그리고 탈출 따옴표에 대처하지 않는 등

+3

문자열에서 이스케이프 된 따옴표는 어떨까요? – Joe

+0

Java 태그를 고려할 때 Java 정규식이라고 생각합니다. – corsiKa

+0

이것은 또한 주석의 인용 부호와 일치합니다. 이것은 잘못된 음수가 없어야하지만 틀린 긍정을 확실히 갖습니다. –

-1

사용이 :

String REGEX = "\"[^\"]*\""; 

String A = "I went to the store to buy a \"coke\" and a box of \"kleenex\""; 
String B = A.replaceAll(REGEX,"Pepsi"); 

와 테스트 다음 'B'

I went to the store to buy a Pepsi and a box of Pepsi 
+0

이 입력으로 시도하십시오 :''큰 따옴표는 \ "여기에 있습니다 - \"<- here \ ""'. – seh

+0

@seh, 당신의 예제에 맞는 출력을 어떻게 생각하십니까? 원래 질문에는 따옴표가 필요하지 않습니다 -within-quotes, 페어링되지 않은 따옴표 또는 심지어 여러 따옴표로 묶인 문자열을 ... – tucuxi

+0

질문을 읽은 후에 "Double-quote"가 "Pepsi" 문자열 리터럴 "은 문자열을 정의하기 위해 호스트 언어 구문에서 유효한 모든 내용을 의미합니다. 원래 질문은 문자열 내에서 문자열 만 언급하는보다 어려운 경우의 범위를 묻지 않았습니다. 그게 바로 문제를 흥미롭게 만드는 이유입니다. 제프리 프리들 (Jeffrey Friedl)의 마스터 링 정규 표현식 (Mastering Regular Expressions) *은 마침내 궁극적 인 이중 인용 문자열 매처를 썼다는 것을 전한 바입니다. RFC 822 전자 메일 주소 매처는 말할 필요도 없습니다 .. – seh

2
이 정규식뿐만 아니라 따옴표를 처리 할 수 ​​

를 산출 (참고 : 확장 된 구문을 펄) :

" 
[^\\"]* 
(?: 
    (?:\\\\)* 
    (?: 
     \\ 
     " 
     [^\\"]* 
    )? 
)* 
" 

은 각각 "이

어쩌면이 조금 아름답게하는 것이 가능하기 전에 \를 탈출의 이상한 양을 가지고 있는지 정의하지만이 양식에서 작동

+0

이 패턴은 VERY 내가 뭘 가까이에? 필요한! 그러나 삽입 된 문자열에 URL이 포함된다면 어떻게 될까요? 예 : 'URL 문자열 : \ "http : \/\/www.google.com \"; "이 표현식이 깨져서"; "만 캡처합니다. (나는 몇 시간 동안 내 머리를 긁어왔다.) – TekuConcept