[regex] 이스케이프 따옴표가있는 따옴표 문자열에 대한 정규식

" It's big \"problem "정규식을 사용 하여 하위 문자열 을 어떻게 얻 습니까?

s = ' function(){  return " It\'s big \"problem  ";  }';     



답변

/"(?:[^"\\]|\\.)*"/

Regex Coach 및 PCRE Workbench에서 작동합니다.

자바 스크립트 테스트 예 :

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);


답변

이것은 많은 리눅스 배포판에서 사용 가능한 nanorc.sample에서 가져온 것입니다. C 스타일 문자열의 구문 강조 표시에 사용됩니다.

\"(\\.|[^\"])*\"


답변

ePharaoh가 제공 한대로 대답은

/"([^"\\]*(\\.[^"\\]*)*)"/

위의 내용을 작은 따옴표 또는 큰 따옴표 문자열에 적용하려면 다음을 사용하십시오.

/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/


답변

여기에 제공된 대부분의 솔루션은 대체 반복 경로, 즉 (A | B) *를 사용합니다.

일부 패턴 컴파일러가 재귀를 사용하여이를 구현하기 때문에 큰 입력에서 스택 오버플로가 발생할 수 있습니다.

예를 들어 Java : http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993

다음과 같은 것 :
"(?:[^"\\]*(?:\\.)?)*", 또는 Guy Bedford에서 제공하는 것은 대부분의 스택 오버플로를 방지하는 구문 분석 단계의 양을 줄입니다.


답변

"(?:\\"|.)*?"

번갈아 가며 \".탈출 따옴표를 통해 통과하면 게으른 정량의 동안 *?당신은 인용 문자열의 끝을지나 가지 않도록합니다. .NET Framework RE 클래스에서 작동


답변

/"(?:[^"\\]++|\\.)*+"/

man perlrePerl 5.22.0이 설치된 Linux 시스템 에서 직접 가져 옵니다. 최적화,이 정규식은 모두의 ‘posessive’형식을 사용 +하고 *이 닫는 따옴표가없는 문자열이 어떤 경우에 일치하지 않을 것이라고 사전에 알려져을 위해, 역 추적을 방지 할 수 있습니다.


답변

/(["\']).*?(?<!\\)(\\\\)*\1/is

인용 된 문자열과 함께 작동해야합니다.