>  기사  >  백엔드 개발  >  정규식을 Glob으로 또는 그 반대로 변환

정규식을 Glob으로 또는 그 반대로 변환

PHPz
PHPz앞으로
2024-02-06 11:03:15823검색

正则表达式到 Glob 以及反之亦然的转换

질문 내용

정규 표현식을 클라우드 프런트엔드에서 지원하는 Globs로 변환하거나 그 반대로 변환해야 한다는 요구 사항이 있습니다. 이를 달성할 수 있는 방법에 대한 제안이 있습니까? 애초에 이것이 가능합니까? 특히 Regex에서 Glob로, 정규 표현식은 상위 집합이므로 모든 Regex를 해당 Glob로 변환하는 것이 불가능할 수도 있다는 것을 알고 있습니까?


정답


glob에서 변환하려면 패턴을 추상 구문 트리로 분할하는 파서를 작성해야 합니다. 예를 들어, 글로브 *-{[0-9],draft}.docx 可能会解析为 [anything(), "-", oneof([range("0", "9"), "draft"] ), ".docx"].

그런 다음 ast를 반복하고 각 노드에 대해 동등한 정규식을 출력합니다. 예를 들어 이를 위해 사용할 수 있는 규칙은 다음과 같습니다.

으아아아

정규 표현식 생성 .*-([0-9]|draft).docx.

특수 문자를 이스케이프 처리해야 하므로 완벽하지는 않습니다. . 是正则表达式中的特殊字符,因此您应该对其进行转义,最终生成 .*-([0-9]|draft).docx는 정규 표현식의 특수 문자이므로 이스케이프해야

됩니다.

엄밀히 말하면 정규식을 모두 glob 패턴으로 변환할 수는 없습니다. kleene stara* (即任意数量的 a 작업은 globbing에 존재하지 않습니다. 간단한 정규 표현식

문자는 globbing 패턴으로 변환될 수 없습니다.

Cloudfront가 어떤 유형의 glob을 지원하는지 잘 모르겠지만(문서에서는 "glob"이라는 용어와 일치하는 항목을 반환하지 않음) 여기에 일반적으로 지원되는 쉘 glob 패턴 와일드카드에 대한 일부 문서가 있습니다

.

다음은 일부 동등한 시퀀스의 요약입니다.
Glob 와일드카드정규 표현식의미모든 단일 문자0개 이상의 문자해당 범위의 모든 캐릭터범위에 없는 문자주어진 캐릭터 중 하나주어진 옵션 중 하나중첩된 와일드카드를 고려한 주어진 옵션 중 하나
? .
* .*
[a-z] [a-z]
[!a-m] [^a-m]
[a,b,c] [abc]
{cat,dog,bat} (cat|dog|bat)
{*.tar,*.gz} (.*.tar|.*.gz)
🎜

위 내용은 정규식을 Glob으로 또는 그 반대로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제