크로스 매칭 정규 표현식


21

여기서 할 일은 두 개의 정규 표현식을 작성하는 것입니다. 각 정규 표현식은 다른 표현식과 일치하지만 자체는 일치하지 않습니다.

두 정규식 모두 다음 형식이어야합니다.

/pattern/optional-flags

이것도 일치해야하는 형식입니다.

가장 짧은 해결책이 이깁니다. 솔루션 길이는 슬래시와 플래그를 포함하여 정규 표현식에서 문자의 합계로 계산됩니다.

선택한 정규식 구문 표준을 사용하거나 차이가있을 때 프로그래밍 언어를 지정하십시오.

즐기세요!


정규식도 다른 정규식의 슬래시 및 플래그와 일치해야합니까?
ProgramFOX

@ProgramFOX 예, 명확하게하기 위해 줄을 추가했습니다.
GOTO 0

일치를 정의 할 수 있습니까? 즉 정규식이 /a/일치 abc합니까?
모자와 사람

2
@TheGuywithTheHat 글쎄, 당신은 전체 문자열과 일치 해야하는 것과 같은 특정 제한을 부과하는 언어를 선택하지 않는 한 그렇게 생각합니다. 이것이 귀하의 우려를 해결합니까?
GOTO 0

1
분명히하기 위해 : PHP PCRE에서 허용하는 것처럼 다른 구분 기호를 사용할 수 없다고 가정합니까? (즉, 제출 /^%/및 없음 %^/%)
Peter Taylor

답변:


7

A 수정자를 사용한 PRCE : 9 자

/A$/
/.A/A

이것이 Doorknob의 /modifier$/답변 에 대한 변형이지만 ,이 혁신은 그것을 혁신에 대한 의견이 아닌 별도의 답변으로 자격이 있다고 생각합니다 : 수정자는 이중 의무입니다. 다른 정규 표현식이 일치하기 만하 기보다는 고정됩니다.

첫 번째 정규 표현식은 리터럴로 끝나는 모든 문자열과 일치합니다 A. 두 번째 정규 표현식은 A시작-시작 플래그를 사용하여 두 번째 문자가 리터럴 인 모든 문자열과 일치합니다 .

온라인 데모


3
이를 극복하기 위해서는 4 개의 비 구분자 문자 만 필요하며, //따라서 각 정규 표현식은 최대 3 개의 비 구분자 문자를 가질 수 있음을 의미합니다. PHP PCRE를 사용하면 해당 제약 조건 내에 73339 개의 자체 일치하지 않는 정규 표현식이 있고 길이가 10보다 작은 쌍의 철저한 검사가 가능합니다 (대부분 구분 기호를 포함하여 5 문자이므로 5.7Gpair가 아닌 32Mpairs 순서). 이 솔루션과 다른 사람은 없습니다. 따라서 특정 정규식 엔진에 최적이라고 주장합니다.
피터 테일러

18

4 + 6 = 10 점

첫 정규 표현식 :

/i$/

두 번째 정규식 :

/^.i/i

깃발 학대를위한 만세! :-피

첫 번째는 끝으로 끝나는 것 i(따라서 i플래그가 있는 정규식)과 일치합니다 .

두 번째는의 두 번째 문자와 일치 i합니다.

대체 버전 : /i$/g/g$/i.


3
또 다른 변형은 다음 /x.$//^.x/
같습니다.

또는 /i$//\/$/i
피터 테일러

또는 /i$//i\$/i
피터 테일러

6

자바 스크립트 정규 표현식, 점수 : 18

첫 정규 표현식 :

/^[^a]+$/

두 번째 정규식 :

/^[^b]+$/

자바 스크립트 테스트 :

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

온라인 테스트 : http://jsfiddle.net/99Sx6/


5

루비 정규식, 15

정규식 :

/.{9}/
/^.{06}$/

문자를 세는 중 ...

온라인 버전

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

첫 정규 표현식 :

/i$/

두 번째 정규식 :

/\/$/i

i$i두 번째로 끝나는 것과 일치합니다 . 첫 번째로 /$끝나는 것과 일치합니다 /.


2
Doorknob의 답변에 게시 한 의견의 속임수.
피터 테일러

@PeterTaylor 지금까지 의견을 알지 못했습니다. 이것들은 독립적 인 발견이었습니다.
Justin

네,시오 나의 버전도 독자적으로 발견했습니다.
피터 테일러

3

5 + 5 = 10

정규식 # 1 :

/0.$/

정규식 # 2 :

/^.0/

0두 정규 표현식 의 s는 메타가 아닌 문자로 대체 할 수 있으며 정규 표현식은 여전히 ​​작동합니다.

0.$두 번째 마지막 문자가있는 모든 항목 0^.0일치 하고 두 번째 문자가 인 모든 항목 과 일치 0합니다.


2
첫 번째 쌍은 유효한 정규 표현식이 아닙니다 /. es 를 이스케이프해야합니다 . 대안은 Doorknob의 답변에 대한 주석의 속임수입니다.
피터 테일러

2

자바 스크립트 정규 표현식, 점수 : 13

첫 정규 표현식 :

/\d/

두 번째 정규식 :

/^[^0]+$/

설명 : 첫 번째 정규식은 숫자가 포함 된 모든 항목과 일치하고, 두 번째 정규식은가 포함되지 않은 모든 항목과 일치합니다 0.

자바 스크립트 테스트 :

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

온라인 테스트 : http://jsfiddle.net/5VYjC/1/



2

점수 : 5 + 5 = 10

알아 내기 위해 30 분이 걸렸습니다.하지만 정말 기뻤습니다 :)

첫번째는 : /j.$/

두 번째는 : /^.j/

첫 번째 j는 오른쪽에서 시작하여 두 번째 위치에서 발생하는 것과 일치합니다 . 두 번째 j는 왼쪽에서 시작하여 두 번째 위치에서 발생하는 것과 일치합니다 .

나는 테스트하지는 않았지만 이러한 RegEx는 문자 (또는 그 이상?) j로 대체 될 수 있기 때문에 실제로 다목적 \w이며 여전히 잘 작동해야한다고 생각합니다.

추신 : 이것은 모든 언어로 (희망적으로) 작동해야합니다. 그래도 작동하지 않으면 아래 의견에 알려주십시오. :)

테스트


그리고 @Quiccunx가 이미 내 버전과 동일한 버전을 게시했음을 알았습니다. 나는 정말로 미안해 Quiccunx이며, 그것이 마음에 든다면 대답을 삭제합니다.
Gaurang Tandon

1

수정 자 x를 사용하는 PCRE : 11 자

/\s/
/ s.$/x

첫 번째는 공백 문자가있는 문자열과 일치하지만 공백은 포함하지 않습니다. 두 번째는 공백을 포함하지만 x수정 자 때문에 무시됩니다 . 두 번째 문자가 인 모든 문자열과 일치합니다 s.

문자 클래스를 사용하는 PCRE 및 기타 엔진 : 11 자

/\w+w/
/\Ww/

첫 번째는 "문자"문자 (문자, 숫자, 밑줄)와 리터럴이있는 문자열과 일치합니다 w. 두 번째는 단어가 아닌 문자와 리터럴이있는 문자열을 찾습니다 w.

문자 클래스 및 단어 경계 앵커를 사용하는 PCRE 및 기타 엔진 : 11 자

/\w\w/
/\bw/

첫 번째는 두 개의 연속 "워드"문자가있는 문자열과 일치합니다. 두 번째는 단어가 아닌 문자 또는 문자열의 시작과 그 뒤에 리터럴이있는 문자열 w입니다.


-1

ECMAScript (11 바이트) :

/^\1?d/
/\d/

다른 REGEXP 엔진 (14 바이트) :

/^\\\\1?d/
/\d/

첫 번째는 \ d [..] 또는 \ 1d [..]와 일치합니다.

두 번째는 숫자가있는 문자열과 일치합니다.

편집하다:

원래이 답변은 모든 엔진과 호환되는 것으로 게시되었지만 잘못된 것으로 판명되었습니다.

캡처 그룹에 대한 참조에 문제가있었습니다 (예 : php).


많은 정규식 엔진은 주변 슬래시없이 정규식을 사용하지만 계산을 요구한다는 것은 분명합니다.
피터 테일러

나는 그것을 대답으로 간주하지 않습니다. 메모를 추가하겠습니다.
Ismael Miguel

1
@PeterTaylor 메모를 추가했습니다. 아파치 버전이 있기 때문이다.
Ismael Miguel

잠깐만 : 첫 엔진은 어떤 엔진에서 \1역 참조로 해석되지 않습니까?
피터 테일러

사용 방법에 따라 다릅니다. 예를 들어 PHP에서는 내부에 넣으면 "/^\1?d/"문제가 발생하지만 그렇게하면 '/^\1?d/'괜찮습니다. 따옴표는 코드가 해석 될 때 큰 차이를 만듭니다.
Ismael Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.