당신의 임무는 일치 할 수없는 가장 짧은 유효한 정규 표현식을 작성하는 것입니다. 빈 문자열이 포함되어 있습니다.
제출물은 다음과 같은 형식이어야합니다 ( "리터럴 표기법").
/pattern/optional-flags
가장 짧은 정규 표현식이 이깁니다. 정규식 크기는 문자로 계산됩니다. (슬래시 및 플래그 포함)
정규 표현식이 어떻게 작동하는지 설명하십시오 (사소하지 않은 경우)
고마워요!
당신의 임무는 일치 할 수없는 가장 짧은 유효한 정규 표현식을 작성하는 것입니다. 빈 문자열이 포함되어 있습니다.
제출물은 다음과 같은 형식이어야합니다 ( "리터럴 표기법").
/pattern/optional-flags
가장 짧은 정규 표현식이 이깁니다. 정규식 크기는 문자로 계산됩니다. (슬래시 및 플래그 포함)
정규 표현식이 어떻게 작동하는지 설명하십시오 (사소하지 않은 경우)
고마워요!
답변:
primo와 Peter Taylor의 답변과 다음 힌트를 따르십시오 man perlre
.
/(?!)/
이 perl 호환 정규 표현식은 빈 문자열과 일치하며 그 뒤에 다른 빈 문자열이 없습니다.
/x\by/
, 그러나 실제로 이런 식으로 정규 표현식을 사용해야한다면-어떤 이유로 든이 대답은 가장 분명합니다)
/(*FAIL)/
가 더 명확 할 것입니다. (그리고 실제로 man perlre
내 것이 실제로 그의 내부로 확장된다고 언급함으로써 그것을 주었다.)
/(*FAIL)/
그래도 휴대용이 아닙니다. 그리고 Perl에서도 부정적인 예측보다 더 모호한 기능이라고 생각합니다.
-Mre=debug
)는 Perl 정규식 최적화 (?!)
프로그램에 (*FAIL)
의해 최적화 되었다고 말합니다 ( OPFAIL
에 따르면 -Mre=debug
). 또한, 나는 (*FAIL)
Perl 5 (그리고 Perl 6, 여기서는) 외부에서 보지 못했다고 생각 <!>
합니다.
/\w\b\w/
\b
'word'문자로 둘러싸인 단어 경계 ( ) ( \w
-중 하나 [_a-zA-Z0-9]
) 단어 경계 앞뒤에있는 문자 중 하나가 '단어'가 아니어야하므로 일치하지 않습니다.
그건 그렇고 : 이것은 비교할 수없는 표현과 비슷합니다.
/\W\b\W/
여기서 \W
단어가 아닌 문자를 의미합니다.
/
계산 되므로 경쟁 규칙에 따라 8 자 입니다. 예를 들어 OP 항목을 참조하십시오 . 그래도 큰 항목입니다!
/$a/
문자열이 끝난 후 "a"를 검색합니다.
또는
/a^/
문자열이 시작되기 전에 a를 검색합니다.
^
과 $
"불법"위치에 그냥 평범한 문자로 취급됩니다. 첫 번째 예는 문자와 일치 $a
에 sed
아마 다른 프로그램을.
echo 'a^b' | grep 'a^b'
대 시도하십시오 echo 'a^b' | grep -E 'a^b'
. ERE Expression Anchoring
5 자
/$.^/
/$^/
빈 문자열과 일치하지만 사이에 문자가 필요하지 않습니다.
$.
현재 줄 번호 변수로 해석 될 수 있다고 생각 합니다. 비어있을 수 있습니다 /^/
. 이 경우이 값은입니다 .
^
과$
'$^'
grep으로 패턴 을 시도 했지만 불행히도 string과 일치했습니다 '$^'
. 똑똑한 grep.
(ECMAScript 맛만)
/[]/
다른 맛이 유효한 문자 클래스합니다 (이 아닌 ]
문자로 간주 될 수 있는 클래스, 그래서 클래스가 결코 폐쇄 때문에 표현이 유효하지 않습니다)하지만, ECMAScript를 표준은 빈 문자 클래스를 사용할 수 있습니다. 이 클래스이기 때문에 그것은 이 문자를 (그래서 빈 문자열이 일치하지 않는) 일치가 아닌 하나의 문자가 포함되어 있기 때문에 실제 문자 중 하나와 일치하지 않습니다.
/[]{0}/
. (Ps. 내 대답은 부분적으로 당신 것 같지만, 나는 실제로 내 것을 쓴 후에 당신의 것을 읽습니다.)
/[]/.test("")
. false를 반환합니다. 문자 클래스가 문자를 포함하지 않더라도 문자 클래스는 빈 문자열과 절대 일치 할 수 없습니다 (문자열의 다음 문자가 나열된 문자 중 하나이면 일치합니다. ELSE는 실패 함). /[]{0}/
ECMAScript에서 합법적이며 빈 문자열과 일치하지만 내 답변과 관련이 있는지 확실하지 않습니다.
/b++b/
소유 정량 기는 가능한 많은 b를 찾은 다음 1을 더 찾습니다. 6 문자이지만 대칭을위한 포인트?
약간의 속임수 일 수도 있지만…
\0
… POSIX 정규식 에서는 거의 모든 구현에있어 거의 모든 구현이 불가능합니다. 기본 RE 및 확장 RE.
그리고 POSIX RE에는 성가신 슬래시와 PCRE가 가지고있는 플래그가 필요하지 않습니다.
0
은 PERL에서 작동하지 않습니다. "0"=~0
사실입니다.
\0
ITYM? 예, 대부분의 perlre (1) 및 PCRE 구현은 C 문자열을 사용하지 않지만이 트릭은 작동하지 않는 크기 제한 버퍼를 사용하지만 대부분 POSIX RE 구현은 C 문자열에서 작동합니다.
/^.^/
문자열이 시작되기 전에 단일 문자로 시작하는 문자열과 일치합니다.
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
및 .
이스케이프 할 필요가 리터럴하지 메타 문자입니다
/.^/
GNU grep 2.5.1 및 egrep에서 작동합니다.
/.^/
= 4 자
//
가요? 그것들은 어디에나 필요하지는 않습니다 ;-)
/
수는 원래 질문 ( "슬래시 및 플래그 포함") 및 OP 항목을 참조하십시오 .
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
이것은 5 문자 정규식입니다.
/[]+/
빈 그룹을 1 회 이상 일치시킵니다.
편집하다:
다른 맛에 대한 내 대답을 제거했습니다.
/.{-1}/
{} 안에 숫자가 아닌 것은 텍스트와 일치합니다.
이것은 ". {-1}"과 일치합니다.
/$^/
시작하기 전에 끝나는 것 ...