RegEx-golf : 문자열의 모든 내용과 일치


10

당신의 임무는 문자열 내부의 모든 것과 일치하는 RegEx를 작성하는 것입니다.

문자열은 이스케이프 처리되지 않은 두 개로 둘러싸인 모든 항목으로 정의됩니다 ".

(A)는 "로 이스케이프 할 수 \도 다시 탈출 할 수있는.

테스트 케이스

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

채점

최단 솔루션이 승리합니다.

명세서

  • 사용 된 맛을 지정하십시오.
  • 입력이 균형을 이룰 것 "입니다.
  • \문자열 시작 구분 기호 바로 앞에는 없습니다 . 예를 들어, 처리 할 필요가 없습니다abc\"def"

1
\앞에 있을까요? 예를 들어 abc\"def".
jimmy23013

한 그룹의 각 문자열과 일치해야합니까? 예를 들어에 두 개의 일치하는 항목을 작성할 수 있습니까? abc"de"하나는 d다른 하나는 e?
jimmy23013

허용됩니다.
Leaky Nun

빈 줄이 있습니까?
마틴 엔더

예, 빈 문자열이 있습니다.
Leaky Nun

답변:


3

PCRE, 21 20 15 19 바이트

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

여기에서 시도하십시오.

이는 큰 따옴표가 시작되기 전에 문자 (또는 입력의 시작)와 일치 한 다음 일치를 재설정하여 큰 따옴표가 다른 일치와 공유되지 않도록합니다.

PCRE, 25 23 바이트

2 바이트를 골라 낸 Martin Büttner에게 감사합니다.

(\\.|[^"])*+(?!"(?R)|$)

여기에서 시도하십시오.

설명

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

소유 수량 자 ( *+)는 음수 예측이 항상 전체 문자열 또는 문자열이 아닌 전체 세그먼트 다음에 시작되도록합니다.

4 가지 경우가 있습니다 :

  • 일치는 문자열 외부에서 시작합니다. \\.설명에 따르면 큰 따옴표와 일치하지 않습니다. 문자열을 시작하는 다음 큰 따옴표 나 입력 끝 직전에 끝날 수 있습니다. 두 경우 모두 부정적인 예측에 실패합니다.
  • 일치는 문자열의 시작 부분에서 시작됩니다. (\\.|[^"])*+완전한 문자열과 일치합니다. 다음 문자는 큰 따옴표 여야하며 입력의 끝이 될 수 없습니다. 큰 따옴표 뒤에는 문자열 외부에 있으므로 다른 일치 항목이 될 수 없습니다. 따라서 부정적인 예측을 통과합니다.
  • 일치는 문자열의 끝에서 시작됩니다. 이전 경우와 같은 방식으로 빈 문자열과 일치합니다. 그러나 설명에 따르면 중요하지 않습니다.
  • 일치는 문자열 중간에서 시작됩니다. 일치하는 항목이 겹치지 않기 때문에 불가능합니다.

시겠습니까 (\\.|[^"])일?
마틴 엔더

"
Bálint

@ Bálint 나는 ([^\\"]|\\.)완벽한 솔루션이 아니라 대신에 의미했습니다 .
마틴 엔더

@ MartinBüttner 오, 좋아
Bálint

Martin의 제안은 작동해야합니다. \\.다음에 문자가 없거나 \줄 바꿈 문자가 있지만 플래그로 수정할 수있는 경우에만 실패 하고 그 경우는 부정적인 표정으로 덮여 있기 때문입니다. 소유 수량 화기는 역 추적을 방지하므로 다른 경우는 없습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

자바 스크립트, 24 바이트

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

그룹 1은 문자열의 내용입니다.


이스케이프 된 따옴표로는 전혀 작동하지 않으므로 사양을 충족하지 못합니다.
ATaco

아 그래-죄송합니다. 어떻게에 대한?
Whothehellis that

닫기하지만 시가, 당신은 외부 일치하지 않아야 "
ATaco

그래, 그게 내가 무서웠 어 자바 스크립트에서 그것을 할 수있는 방법이 없다고 생각합니다.
Whothehellisthat

당신은 하위 그룹에서 그것을 캡처 할 수 있습니다
ATaco

0

자바 스크립트, 21 15 13 12 바이트

"((\\?.)*?)"

문자열 내용은 그룹 1에 있습니다.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.