정규 표현식의 정의는 무엇입니까?


10

나는 최근 질문에 대한 나의 대답에 대한 의견에서 정규 표현을 구성하는 것에 대해 Ghoti 와 우호적 인 논쟁에 들어갔다 . 다음은 정규식이라고 주장했습니다.

`[Rr]eading[Tt]est[Dd]ata`

Ghoti는 그 대신 파일 glob라고 주장하면서 동의하지 않았습니다. Wikipedia 의 glob 페이지는 다음과 같이 주장합니다.

글롭은 클레인 스타에 대한 구문을 포함하지 않으므로 표현식의 앞 부분을 여러 번 반복 할 수 있습니다. 따라서 정규 표현식으로 간주되지 않으므로 주어진 유한 알파벳보다 더 큰 정규 언어 세트를 설명 할 수 있습니다.

그러나이 주장에 대한 인용은 없으며, 이는 특정 위키 백과 편집자의 의견 일뿐임을 나타냅니다.

The Single UNIX® Specification, Version 2 는 BRE (Basic Regular Expression)가 단일 문자 일 수도 있다고 말합니다.

일반 문자는 BRE 특수 문자에 나열된 BRE 특수 문자를 제외한 지원되는 문자 세트의 모든 문자와 일치하는 BRE입니다.

그렇다면 * nix 세계에서 정규 표현식의 정의는 무엇이며 해당 정의는 파일 globs를 제외합니까?


6
이론적 CS에서 정규 표현식은 정규 언어에 대한 설명으로, 유한 오토 마톤이 인식 할 수있는 언어입니다. 유닉스 세계에서는 훨씬 더 복잡하며 단일 정의가 없습니다. 거기 POSIX 사양 2 개 정규식 방언입니다 : 확장 및 기본, 같은 도구를 사용하는 grep, sed하고 awk. Vim은 Perl과 마찬가지로 자체적 인 다양성을 사용합니다.
jw013

따라서 그 정의에 따르면 파일 glob BRE 권리입니까?
terdon

2
아니요, 파일 글로브는 BRE 가 아닙니다 . 어떻게 생각하십니까? BRE의 POSIX 설명과 globbing의 POSIX 설명을 읽으면 그것들이 동일하지 않다는 것을 알 수 있습니다. 예를 들어, *BRE와 globs에서 두 가지 의미가 있습니다. 참고 : glob 라는 용어 는 POSIX 사양의 어느 곳에서나 사용 되지 않는다고 생각합니다. 대신 패턴 일치라고 하며 쉘 언어 장에 설명 되어 있습니다.
jw013

답변:


10

lk- 말했듯이, 의 옵션은 글로브 아닌 정규 표현식으로 인수를 처리합니다.-namefind

문자열이 glob 또는 정규식으로 해석되는지 또는 일반 문자열로 해석되는지는 해석을 수행하는 데 사용되는 내용에 따라 다릅니다. 상황의 문제입니다. 당신의 예에서 문자열은 [Rr]eading[Tt]est[Dd]ata다양한 방법으로 평가,하지만 그것을 할 수 있습니다 것은 당신이 그것을 사용하는 방법에 따라 달라집니다. 그것을 glob로 사용하십시오. glob입니다. 정규식으로 사용하십시오. 정규식입니다. 이 문제가 발생한 질문 의 경우 OP는 문자열을 정규식으로 설명했습니다. 따라서 우리는 그가 정규식으로 해석하려고한다고 가정 할 수 있습니다.

단일 문자는 절대적으로 정규 표현식이 될 수 있습니다. 또한 문자열이 될 수도 있고 글로브 일 수도 있습니다. 원한다면 바이트 또는 tinyint로 해석 될 수 있습니다. 그것은 모두 상황에 달려 있습니다.

다양한 형태의 정규 표현식에 대한 많은 사양이 있습니다. BRE와 ERE는 잘 문서화되어 있습니다. PCRE는 다양한 기능을 추가합니다. 많은 정규 표현식 통역사는 예를 들어 "모든 ERE 및 일부 PCRE"를 구현합니다. 또는 ERE에서 일부 기능을 뺀 것입니다. 공식적인 사양으로 가면 많은 도구가 정규식 지원을 주장하여 부정확하거나 불완전한 것으로 판명됩니다. 세부 사항을 알면 정규식을 평가하는 도구 내에서 사용 가능한 기능 모음에 솔루션을 적용 할 수 있습니다.

따라서 ... 글로브를 "제외"하는 정의를 찾고 있다면 잘못된 관점에서 이것을보고있는 것입니다. 무엇인가하는 것은 의해 결정됩니다 당신이 그것을 사용하는 방법 .


7

[Rr]eading[Tt]est[Dd]ata글로브 (glob)와 정규 표현식 모두에 유효한 것으로 보이며, 나는 두 해석에서 동일한 "의미"를 가지고 있다고 생각합니다. 그러나 -name옵션은 find인수를 정규식이 아닌 glob로 취급합니다.

이 차이는 foo*유효한 glob 및 유효한 정규 표현식이지만과 같이 해석에 따라 다른 의미를 갖는 인수를 제공하는 경우 중요합니다 .

글로브 패턴으로 해석하면,이 일치합니다 foo, foobar, foo123, 등

정규 표현식으로 해석하면,이 일치합니다 fo, foo, foooooo, 등


고맙게도, 글로브 패턴과 정규 표현식의 차이점을 봅니다. 그래도 정규식의 공식적인 정의는 무엇입니까?
terdon

1
용어가 일반적으로 사용되므로 "정규 표현식"에 대한 단일 정의가 있는지 모르겠습니다. POSIX 정규식 또는 Perl 정규식과 같은 다른 구문 사양이 있습니다. 여기에는 역 참조 또는 미리보기와 같은 다른 "기능"이 포함됩니다. 이것들은 더 이상 가장 엄격한 의미의 정규 표현이 아닐 수 있지만 (정규 공식 언어의 맥락에서) 여전히 그렇게 지칭됩니다.
lk-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.