2014-06-06 2 views
1

하나의 큰 문자열에서 하위 문자열을 추출하려고합니다. 추출 된 하위 문자열은 다음 규칙을 따라야합니다. 1. 두 개의 큰 따옴표 사이 (예 : "hello \"jonathan \ "how are you")는 "큰 따옴표"없이 "jonathan"을 추출합니다.정규식 다중 따옴표 선택

  1. 작은 따옴표로만 표시됩니다.

  2. 작은 따옴표는 큰 따옴표로 묶은 일반 문자로 간주됩니다. (예 : 오늘 "안녕하세요"Jonathan 님, "오늘 어떠세요")이 하위 문자열을 추출합니다. "Jonathan How '는'큰 따옴표없이 '입니다. 이 예에서,

    Pattern p1 = Pattern.compile("([\"]*[\']*[\']*[\"])"); 
    

    이 하나 하나 문제 (NUM 3) 해결 :

나는이 패턴을 포함하는 다양한 조합을 시도했습니다

String s = "Hello \"Jon\'hello\'athan\" how are 'you'" 

그것은 추출물

을한다
Jon'hello'athan 

같은 omething : 패턴에

([\'])|[\"]) 

, 그것이 전체 패턴처럼 취급 당신은 무엇을 추천 할 것입니다

([\'])|[\"]) 

을했다? 에,

(['"])((?:(?!\1).)*)\1 

나 : 는만큼 당신이 탈출 따옴표 처리 할 필요가 없습니다 당신에게

답변

2

감사하고, 한 모든 따옴표가 제대로 균형으로, 당신은 negative lookahead assertion를 사용할 수있다 자바 :

Pattern p1 = Pattern.compile("(['\"])((?:(?!\\1).)*)\\1"); 

설명 :

(['"]) # Match any quote character, capture it in group 1 
(  # Match and capture in group 2: 
(?:  # Start of non-capturing group that matches... 
    (?!\1) # (as long as it's not the same quote character as in group 1) 
    .  # ...any character 
)*  # any number of times. 
)  # End of capturing group 2 
\1  # Match the same quote as before 

테스트하기 live on regex101.com.

+0

너무 빨리 답변 해 주셔서 감사합니다. Jon'hello'athan "나는 – johni

+0

user3454745 @ 싶습니다 : 내가이 실행할 때 이 내가 무엇을 얻을입니다 ... 사실은 나를 위해 작동하지 않았다 당신의 두 번째 그룹을 취할 필요를' Matcher' 객체 ('.find()'를 수행 한 후) :'myMatcher.group (2)'는'Jon'hello'athan'을 포함합니다. –