가장 짧은 정규 표현식


59

당신의 임무는 일치 할 수없는 가장 짧은 유효한 정규 표현식을 작성하는 것입니다. 빈 문자열이 포함되어 있습니다.

제출물은 다음과 같은 형식이어야합니다 ( "리터럴 표기법").

/pattern/optional-flags

가장 짧은 정규 표현식이 이깁니다. 정규식 크기는 문자로 계산됩니다. (슬래시 및 플래그 포함)

정규 표현식이 어떻게 작동하는지 설명하십시오 (사소하지 않은 경우)

고마워요!


이것은 나에게서 질문에 영감을 주었다. 그래도 며칠 기다릴게요 두 개의 정규식 질문을 동시에 활성화하고 싶지 않음
Cruncher

13
어떤 구현에 따라 "유효"? 방금 펄이 괜찮은 재미있는 것을 찾았습니다. (그리고 그것은 내가 찾을 수있는 유일한 RE 문법 에 따라 유효 하지만 그 grep과 파이썬의 모듈은 거부합니다.
Josh Caswell

1
예, 정규식 어떤 방언이 있습니까? 많은 다른 것들이 있습니다.
hippietrail

1
그러나 대통령의 이름은 어떻습니까? xkcd.com/1313
Carl Witthoft

@CarlWitthoft 해당 콘테스트에 참여하려면 프로그램이 필요합니다 : codegolf.stackexchange.com/q/17718/2180
boothby

답변:


53

6 자

primo와 Peter Taylor의 답변과 다음 힌트를 따르십시오 man perlre.

/(?!)/

이 perl 호환 정규 표현식은 빈 문자열과 일치하며 그 뒤에 다른 빈 문자열이 없습니다.


+1-이것은 아마도 가장 짧은 대답 일 것입니다. (와 함께 /x\by/, 그러나 실제로 이런 식으로 정규 표현식을 사용해야한다면-어떤 이유로 든이 대답은 가장 분명합니다)
Martin Ender

@ m.buettner : 감사합니다. 그러나 primo 's /(*FAIL)/가 더 명확 할 것입니다. (그리고 실제로 man perlre내 것이 실제로 그의 내부로 확장된다고 언급함으로써 그것을 주었다.)
Nate Eldredge

/(*FAIL)/그래도 휴대용이 아닙니다. 그리고 Perl에서도 부정적인 예측보다 더 모호한 기능이라고 생각합니다.
Martin Ender

3
오늘날 거의 모든 인기있는 (Perl-inspired) 풍미에서 둘러보기를 얻는 반면, 나는 Perl에서만이 제어 동사를 본 적이 없습니다.
Martin Ender

1
실제로 Perl 문서 (및 -Mre=debug)는 Perl 정규식 최적화 (?!)프로그램에 (*FAIL)의해 최적화 되었다고 말합니다 ( OPFAIL에 따르면 -Mre=debug). 또한, 나는 (*FAIL)Perl 5 (그리고 Perl 6, 여기서는) 외부에서 보지 못했다고 생각 <!>합니다.
Konrad Borowski

39

8 자

/(?=a)b/

우리는 모두 않은 문자가 포함 된 문자열이 필요 a하고 b분명 불가능한를.


19
/(?!x)x/더 불가능 해 보인다 ;-)
Howard

@PeterTaylor 어디서?
o0 '.

@Lohoris, 어디?
피터 테일러

@PeterTaylor 그가 말한 터무니없는 규칙을 어디에 넣었는지 찾을 수 없었습니다.
o0 '.

7
얘들 아, 내가 선택한 계산에 대해 미안, 슬래시를 포함하는 옵션 플래그 때문에 슬래시를 포함하는 것이 더 간단 할 것이라고 생각했습니다.
xem

31

5 자

사람 남용 모두 달리 $하고 ^...이 실제로 Perl로 작동합니다 :

/V\A/

\A 문자열의 시작과 일치합니다.


그것도 작동합니다 ^.
Tomas


28

8 자

/\w\b\w/

\b'word'문자로 둘러싸인 단어 경계 ( ) ( \w-중 하나 [_a-zA-Z0-9]) 단어 경계 앞뒤에있는 문자 중 하나가 '단어'가 아니어야하므로 일치하지 않습니다.

그건 그렇고 : 이것은 비교할 수없는 표현과 비슷합니다.

/\W\b\W/

여기서 \W단어가 아닌 문자를 의미합니다.


랩핑 슬래시가 /계산 되므로 경쟁 규칙에 따라 8 자 입니다. 예를 들어 OP 항목을 참조하십시오 . 그래도 큰 항목입니다!
Josh Caswell

또한 짧은 항목 중 일부에 구현 의존적 인 문제 가 주어지면 승자 (또는 Peter Taylor의 항목 과 묶여 있음) 일 수도 있습니다 !
Josh Caswell

매우 우아합니다! 나는 이와 같은 것이 있어야한다고 생각했습니다!
Tomas

22

4 자

/$a/

문자열이 끝난 후 "a"를 검색합니다.

또는

/a^/

문자열이 시작되기 전에 a를 검색합니다.


20
2 문자 솔루션이 있다는 것을 알고 있다면 왜 질문을 게시합니까?
피터 테일러

3
@Howard : 그것은 빈 문자열과 일치합니다 : jsfiddle.net/RjLxJ
ProgramFOX

10
탁월한 솔루션을 제공 한 후에 왜 항상 이러한 문제를 발견해야합니까 :(
Cruncher

43
-1 : 퍼팅 ^$"불법"위치에 그냥 평범한 문자로 취급됩니다. 첫 번째 예는 문자와 일치 $ased아마 다른 프로그램을.
벤 잭슨

2
@Ben Jackson, POSIX ERE에게는 해당되지 않습니다. echo 'a^b' | grep 'a^b'대 시도하십시오 echo 'a^b' | grep -E 'a^b'. ERE Expression Anchoring
laindir

21

5 자

/$.^/

/$^/ 빈 문자열과 일치하지만 사이에 문자가 필요하지 않습니다.


6
이것은 불행히도 Perl ( 및 sed ) "$a^"에서 (또는 대신에 'a') 와 일치 합니다. 그래도 여전히 좋은 것입니다!
Josh Caswell

@ JoshCaswell : perl이 $.현재 줄 번호 변수로 해석 될 수 있다고 생각 합니다. 비어있을 수 있습니다 /^/. 이 경우이 값은입니다 .
MvG

'사이'라는 문자는 한 문자 문자열을 의미합니다.
jwg

3
@jwg 스왑 된 알 ^$
mniip

'$^'grep으로 패턴 을 시도 했지만 불행히도 string과 일치했습니다 '$^'. 똑똑한 grep.
joeytwiddle

19

9 자

확실하지는 않지만 /[^\S\s]/문자가 아니라 하나 이상을 의미하므로 일치 할 수 없어야합니다.


필요하지 않습니다 +.
피터 테일러

10
/ [^ \ S \ s] / = 9 글자
xem

19

6 자

나는이 정규식이 효과가 있다고 생각합니다.

/\b\B/

단어 경계 ( \b)가 아닌 단어 경계 ( ) 와 일치합니다 \B. 어느 것이 부과 되는가? 내가 이것을 당신에게 설명해야합니까?


이 단어 경계가 아닌 단어 경계를 검색하지 않습니까?
grexter89

1
@ grexter89 예, 그러나 사이에 문자를 사용할 수 없습니다. 즉, 경계와 비 경계가 동일한 공간을 차지해야합니다.
모자를

2
난이게 좋아. 잘 잡았습니다.
primo

18

4 자

(ECMAScript 맛만)

/[]/

다른 맛이 유효한 문자 클래스합니다 (이 아닌 ]문자로 간주 될 수 있는 클래스, 그래서 클래스가 결코 폐쇄 때문에 표현이 유효하지 않습니다)하지만, ECMAScript를 표준은 빈 문자 클래스를 사용할 수 있습니다. 이 클래스이기 때문에 그것은 문자를 (그래서 빈 문자열이 일치하지 않는) 일치가 아닌 하나의 문자가 포함되어 있기 때문에 실제 문자 중 하나와 일치하지 않습니다.


문자와 일치한다고 말하더라도 빈 문자열과 일치하지 않습니까? 또는 이것이 불법이라고 생각하십니까 : /[]{0}/. (Ps. 내 대답은 부분적으로 당신 것 같지만, 나는 실제로 내 것을 쓴 후에 당신의 것을 읽습니다.)
nl-x

@ nl-x 이것을 브라우저의 콘솔에 붙여 넣으십시오 : /[]/.test(""). false를 반환합니다. 문자 클래스가 문자를 포함하지 않더라도 문자 클래스는 빈 문자열과 절대 일치 할 수 없습니다 (문자열의 다음 문자가 나열된 문자 중 하나이면 일치합니다. ELSE는 실패 함). /[]{0}/ECMAScript에서 합법적이며 빈 문자열과 일치하지만 내 답변과 관련이 있는지 확실하지 않습니다.
Martin Ender

루비 2.0에서 실패
Nakilon

@Nakilon은 물론입니다. 루비는 ECMAScript 맛을 구현하지 않습니다.
Martin Ender

15

6 자

/b++b/

소유 정량 기는 가능한 많은 b를 찾은 다음 1을 더 찾습니다. 6 문자이지만 대칭을위한 포인트?


허 ... 방금 새로운 기능을 배웠습니다. 분명히 내 정규식 기술이 오래되었습니다. 고마워, +1
Ilmari Karonen

8

6 자

/(\1)/

승자는 아니지만 재미 있다고 생각했습니다. grep과 Python은 이것에 barf이지만 Perl은 괜찮습니다.

구현에 매우 의존적 인 것 같습니다 (이상 함을 감안할 때 놀랍지 않습니다). Bob 은 아래 에서 JavaScript 정규식 엔진의 모든 항목 과 일치한다고보고합니다 .


.NET의 정규식 엔진이 그것을 받아들이는 것 같습니다.

그리고 그것은 JS에 어떤 입력이 있더라도 항상 (빈 문자열) 일치합니다
Bob

8

약간의 속임수 일 수도 있지만…

\0

POSIX 정규식 에서는 거의 모든 구현에있어 거의 모든 구현이 불가능합니다. 기본 RE 및 확장 RE.

그리고 POSIX RE에는 성가신 슬래시와 PCRE가 가지고있는 플래그가 필요하지 않습니다.


+1 좋음 !! 불행히도, 발바닥 0은 PERL에서 작동하지 않습니다. "0"=~0사실입니다.
Tomas

유일한 \0ITYM? 예, 대부분의 perlre (1) 및 PCRE 구현은 C 문자열을 사용하지 않지만이 트릭은 작동하지 않는 크기 제한 버퍼를 사용하지만 대부분 POSIX RE 구현은 C 문자열에서 작동합니다.
mirabilos

5

5 자

/^.^/

문자열이 시작되기 전에 단일 문자로 시작하는 문자열과 일치합니다.


6
또한 문자열과 일치합니다".^"
boothby

@boothby : 어떤 언어가 일치합니까? 파이썬에서는 그렇지 않습니다. re.findall(r'^.^', '.^', re.DEBUG)
P̲̳x͓L̳

8
만화 연산자 사용을위한 +1 ( stackoverflow.com/questions/3618340/… 참조 )
프로토 타입

@boothby ^.이스케이프 할 필요가 리터럴하지 메타 문자입니다
PXL

1
펄에서 깨졌습니다. 이 질문은 실제로 언어에 대한 몇 가지 기본 규칙을 설정해야합니다.
boothby

5

4 자 :

/.^/

GNU grep 2.5.1 및 egrep에서 작동합니다.


/.^/= 4 자
Alexey Popkov

왜 필요한 //가요? 그것들은 어디에나 필요하지는 않습니다 ;-)
RSFalcon7

줄 바꿈 /수는 원래 질문 ( "슬래시 및 플래그 포함") 및 OP 항목을 참조하십시오 .
Alexey Popkov

권리! 나는 읽기를 그리워 :(
RSFalcon7

아니요, 아래와 같은 이유로 : 실제로“^”는 패턴의 시작 부분에있는 경우에만 특별합니다. 그 밖의 어떤 "^"도 이스케이프 할 필요가 없으므로이 답변은 잘못되었습니다.
mirabilos

4

Perl 6 (5 자)

/<!>/

분류 규칙 남용 (Perl 6 정규식은 다르고 설계 상 별표 정규식과 호환되지 않기 때문에), 나는 상관하지 않습니다. <!>규칙은 정규 표현식이 일치하지 않음을 Perl 6에 알립니다.


4

6 바이트

/(*F)/

(*FAIL)perl 호환 정규식 엔진에서 지원 하는의 약어입니다 . 이것을 지적 해준 @HamZa 에게 감사합니다 .

9 바이트

/(*FAIL)/

동사를 지원하는 정규식 엔진과 함께 작동해야합니다. 나는 이것이 더 이상 골프를 칠 필요가 있다고 확신하지 못한다.


1
어떻게 작동합니까?
boothby

@boothby (*FAIL)는 항상 실패하는 동사입니다.
primo

@primo 당신은 그냥 사용할 수 있습니다 /(*F)/:)
HamZa

4

4 자

/$./

문자열이 끝난 후 모든 문자가 필요합니다


다른 두 가지 $와 마찬가지로 패턴의 끝에서만 특별합니다.
mirabilos

3

슬래시가있는 4 자 2

TXR 언어의 정규식 엔진에서 빈 문자 클래스 []는 문자와 일치하지 않으므로 문자열이 없습니다. 문자 클래스에는 문자 일치가 필요하기 때문에이 방식으로 작동하며 비어 있으면 문자를 충족시킬 수 없음을 지정합니다.

또 다른 방법은 /.*/보수 연산자를 사용하여 "빈 문자열을 포함한 모든 문자열 세트"를 뒤집는 것입니다 /~.*/. 해당 세트의 보완에는 문자열이 전혀 없으므로 아무 것도 일치시킬 수 없습니다.

이것은 모두 맨 페이지에 설명되어 있습니다 :

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

슬래시는 정규 표현식 구문의 일부가 아닙니다. 그들은 S- 표기법 표기법에서 정규 표현식을 구분하는 구두점입니다. 증거:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex

답변 주셔서 감사합니다. 슬래시 계산에 다시 죄송합니다. 사람들이 깃발을 사용한다면 그것들을 포함시키는 것이 더 쉬울 것이라고 생각했습니다.
xem

1

6 자

(또는 어떻게 보느냐에 따라 4)

/{,0}/

루비 2.0에서 실패
Nakilon

어떤 정규식 구현에서 오류가 발생하지 않습니까?
피터 테일러

PHP의 preg_match를 사용하여 테스트했습니다.
Tercy

1

이것은 5 문자 정규식입니다.

/[]+/

빈 그룹을 1 회 이상 일치시킵니다.

편집하다:

다른 맛에 대한 내 대답을 제거했습니다.

/.{-1}/

{} 안에 숫자가 아닌 것은 텍스트와 일치합니다.

이것은 ". {-1}"과 일치합니다.


이것은 ECMAScript 풍미에서만 작동합니다. 대부분의 (모든?) 다른 사람들에게는 유효한 표현이 아닙니다.
Martin Ender

유효하지 않습니까?
Wasi

@ ECMAScript에 적합하지 않은 맛
Martin Ender

0

5 자

이것이 바보처럼 들리지 않기를 바랍니다. /[]+/


아니. 유효한 정규식이 아닙니다.
모자

@RyanCarlson 그것은 유효하고 합법적입니다 ... 적어도 Ecmascript에서.
nl-x

-1
/$^/

시작하기 전에 끝나는 것 ...


7
빈 문자열 (일부 RE 구현에서는 어쨌든)과 일치합니다.
Josh Caswell

1
구현이 중단되었습니다 :)
simon

2
귀도에게 더 잘 알려 주십시오.
Josh Caswell

7
으로 더 중요한 것은, 벤 잭슨 지적 이 일치하지 않는 경우, Perl로, ""그것은 않는 두 리터럴 문자를 포함하는 문자열과 일치 : "$^".
Josh Caswell

+1 방금 같은 게시물을 게시하고 싶었습니다! @Josh, PERL에서 작동하며 빈 문자열과 일치하지 않습니다! 벤의 의견이 깨졌습니다.
Tomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.