KornShell 패턴은 정규식입니까?

KornShell 패턴은 정규식입니까?

KornShell 모드는 반복 지정자(예: , )와 많은 멋진 기능 간의 부정을 사용하여 POSIX 쉘 "glob" 모드(예: *, 등)를 확장합니다.?*(...)+(...)

호비스트 프로젝트에서는 BRE, ERE, JavaScript RegExp와 같은 다양한 정규식 변형 대신 문자열 처리를 위해 이러한 패턴을 구현할 계획입니다. 내 생각에 가장 큰 이점은 패턴을 작성할 때 백슬래시 문자 사용을 피할 수 있기 때문에 C 문자열에서 덜 장황하다는 것입니다.

컴퓨터 과학에 대한 나의 제한된 이해는 KornShell 모드가 기존 구문 규칙을 따르도록 만드는 기능을 지원한다는 것을 암시합니다.

질문: 이것이 기술적으로 올바른가요? (그렇지 않더라도 나는 여전히 이 하위언어가 가치 있고 바람직하다고 생각한다.)

답변1

예, 맞습니다. 일반 확장 정규 표현식을 보다 직접적으로 변환하는 zsh의 확장 glob glob 패턴과 마찬가지로 정규 표현식으로 자격을 얻을 수 있습니다.

오히려 다루기 힘든 크쉬 93
. ? ?
x* x# *(x)
x+ x## +(x)
x{1,2} x(#c1,2) {1,2}(x)
[...] [...] [...]
(...) (...) @(...)
a|b (a|b) @(a|b)
^ (#s) 없음 1
$ (#e) 없음 1
x? (|x) ?(x)
\1² 없음² \1

ksh93의 내장 함수는 printf정규식을 한 방언에서 다른 방언으로 변환할 수도 있습니다.

$ printf '%P\n' '^(x{1,3})?a+'
?({1,3}(x))+(a)*
$ printf '%R\n' '*(x)'
^(x)*$

ast-open 구현에는 일치를 위해 ksh93 확장 glob 패턴을 사용하는 / grep가 있습니다 .-K--ksh-regexp

하지만 난 그래도 전화하는 걸 피하겠어정규식혼란만 야기할 수 있기 때문입니다.


1 glob 패턴은 일반적으로 기본적으로 고정되어 있지만 일부 컨텍스트에서는 일부 외부 구문을 통해 고정될 수 있습니다(예: ${var/#pattern/replacement}처음에 고정된 패턴과 유사).${var/pattern/replacement}

² 표준 ERE에는 역참조가 없으며 일부 ERE 엔진은 이를 확장으로 지원하지만 표준 BRE에만 있습니다. 어쨌든 zsh와 ksh93은 모두 지원합니다.포착부분을 ​​일치시키고 나중에 다시 호출합니다( 컨텍스트에 따라 $MATCHzsh에서 / $match[1]활성화 또는 ksh93에서 / (정확한 일치) / 사용 가능).(#m)(#b)\0${.sh.match[0]}sed&\1${.sh.match[1]}

관련 정보