2017-04-12 6 views
1

정규식 함수 pattern/matcher에서 사용할 문자열에서 이중 달러를 이스케이프하는 데 문제가 있습니다.달러를 그만두는 것

이 문자열의 일부입니다

WHERE oid_2 = $$test$$ || oid_2 = $$test2$$ 

이 내가 솔루션 근처에 가려고했습니다 가장 가까운 코드 :

List<String> strList = new ArrayList<String>(); 
Pattern pattern = Pattern.compile("\$\$.*?\$\$"); 
log.debug("PATTERN: "+pattern) 
Matcher matcher = pattern.matcher(queryText); 
while (matcher.find()) { 
    strList.add(matcher.group()); 
} 
log.debug(strList) 

이 내가

를 얻을 디버그 출력
- PATTERN: $$.*?$$ 
- [] 

패턴이 실제로 맞지만 문자열에 자리 표시자를 찾을 수 없습니다.

테스트에서 "$$ test $$"를 "XXtestXX"로 바꾸려고 시도했지만 모든 것이 완벽하게 작동합니다. 내가 뭘 놓치고 있니? "/ $"문자열 "\\"을 시도했지만 여전히 해결책이 없습니다.

+0

https://ideone.com/Olm30x –

+0

"\\ $ \\ $. *? \\ $ \\ $"을 참조하십시오. 달러 기호 뒤의 불법 문자열 본문 문자. 해결책 : 리터럴 달러 기호 "\ $ 5"를 이스케이프하거나 값 표현식 "$ {5}"@ 7 행 38을 대괄호로 묶으십시오. Pattern pattern = Pattern.compile ("\\ $ \\ $. *? \\ $ \\ $ ")^1 오류 – GiLA3

+0

슬래시 문자열을 사용하는 동안 작동합니다! 고마워, 내가 그 솔루션을 시도했다는 것을 확신했지만 어쨌든 나는 다시는 감사하지 않았다! – GiLA3

답변

1

정규식의 $은 문자열의 끝과 일치합니다. 리터럴 $ 기호로 사용하려면 리터럴 백 슬래시로 이스케이프 처리해야합니다.

$$.*?$$과 같이 리터럴 문자열로 변환 된 문자열은 2 자릿수의 문자열 위치, 0+ 문자는 가능한 한 적게, 그리고 다시 2 개의 문자열은 거의 의미가 없습니다. 실제로 Groovy에서 큰 따옴표로 묶인 문자열 리터럴에 변수를 삽입하고 두 개의 백 슬래시를 사용하여 리터럴 백 슬래시 ("\\\$\\\$.*?\\\$\\\$")를 정의하는 데 사용되는 $을 먼저 이스케이프하려면 백 슬래시가 필요합니다.

그러나 정규식으로 작업 할 때 특수 문자를 이스케이프 처리해야 할 필요가있는 모든 문자는 단일 백 슬래시이므로 매우 유용합니다.

def regex = /\$\$.*?\$\$/; 
def s = 'WHERE oid_2 = $$test$$ || oid_2 = $$test2$$' 
def m = s =~ regex 
(0..<m.count).each { print m[it] + '\n' } 

online demo를 참조하십시오 여기에

는 그루비에있는 문자열에서 모든 일치를 추출하는 샘플 코드입니다.

+0

같은 이름을 가진 각 자리 표시 자에 대한 변수가 있다면 그 값을 어떻게 바꿀 수 있습니까? 예를 들어, 문자열 테스트 = "1"및 문자열 test2 = "2", 모든 $$ 테스트 $$를 "1"로 바꾸고 모든 $$ test2 $$를 "2"로 바꾸는 가장 쉬운 방법은 무엇입니까? 요구 사항이 명확 해지기를 바랍니다. – GiLA3

+0

변수를 (이름으로) 값으로 대체해야합니까? [이와 비슷한 것입니까?] (https://ideone.com/mBpDWO) –

+0

문자열 안에있는 경우 [다음과 같은] (https://ideone.com/tmdGut)을 사용하십시오. –