2016-06-13 7 views
2

java regex replace를 사용하여 문장의 단어를 바꾸고 싶습니다. 나는 &가 D로 끝나는로 시작하는 모든 단어를 대체 할 경우자바 정규 표현식을 사용하여 단어를 바꿔 쓰고 따옴표는 쓰지 마십시오.

테스트 문자열은 a_b a__b a_bced adbe a_bc_d 'abcd' ''abcd''

입니다. 나는 String.replaceAll("(?i)\\ba[a-zA-Z0-9_.]*d\\b","temp")을 사용하고 있습니다.

의 내가 따옴표로 문자열을 고려하지 않으려면 내 정규식해야한다 무엇 a_b a__b temp adbe a_bc_d 'temp' ''temp''

로 교체.?

내가 사용했습니다. String.replaceAll("[^'](?i)\\ba[a-zA-Z0-9_.]*d\\b[^']","temp") a_b a__btempadbe temp'abcd' ''abcd''으로 바뀝니다. 그 단어의 공백 하나를 제거합니다. 따옴표 안에없는 문자열 만 바꾸는 방법이 있습니까?

추신 :이 String.replaceAll("[^'](?i)\\ba[a-zA-Z0-9_.]*d\\b[^']"," temp ")에 대한 대안이 있습니다. 그러나 어떤 경우에는 실패합니다.

문장에서 단어를 바꾸려면 내 정규 표현식을 사용해야합니다. & 문자열을 옆쪽 따옴표로 묶어서는 안됩니다. 미리 감사드립니다 ... !!!

답변

0

테스트를하기 전에 대상 후 견적을 거기 아닌지 당신이 알고 수 없기 때문에 잘못된 접근입니다 설명 된 견적은 시작 견적이나 마감 견적입니다. (테스트 문자열의 시작 부분에 따옴표를 추가하고 간단한 패턴을 테스트하려고하면 'inside'a_outside_d'inside')이 표시됩니다.

따옴표가 안쪽인지 바깥 쪽인지 알 수있는 유일한 방법은 처음부터 (또는 끝 부분부터 문자열을 확인하는 것입니다. 따옴표가 맞지 않으면 오류가 발생하기 쉽지 않습니다.). 그렇게하려면 대상, 예를하기 전에 가능한 모든 문자열을 설명해야합니다

\G([^a']*+(?:'[^']*'[^a']*|\Ba+[^a']*|a(?!\w*d\b)[^a']*)*+)\ba\w*d\b 

세부 정보 :

\G # matches the start of the string or the position after the previous match 
(
    [^a']*+ # all that isn't an "a" or a quote 
    (?: 
     '[^']*'  [^a']* # content between quotes 
     | 
     \Ba+  [^a']* # "a" not at the start of a word 
     | 
     a(?!\w*d\b) [^a']* # "a" at the start of a word that doesn't end with "d" 
    )*+ 
) # all that can be before the target in a capture group 
\ba\w*d\b # the target 

는 자바 문자열에서 백 슬래시를 탈출하는 것을 잊지 마세요 : \ => \\합니다.

가 교체를 수행하려면 캡처 그룹 1을 참조해야합니다

$1temp 

참고 : 따옴표 사이에 탈출 따옴표 처리에 '[^']*'을 변경 :
'[^\\']*+(?s:\\.[^\\']*)*+'.

Demo : 자바 버튼을 클릭하십시오.