Lua 패턴 매칭과 정규 표현식
저는 현재 루아를 배우고 있습니다. lua의 패턴 일치와 관련하여 lua.org의 lua 문서에서 다음 문장을 발견했습니다.
그럼에도 불구하고 Lua의 패턴 일치는 강력한 도구이며 표준 POSIX 구현과 일치하기 어려운 일부 기능을 포함합니다.
posix 정규식에 익숙하기 때문에 lua 패턴 일치가 정규식에 비해 "더 나은"일반적인 샘플이 있는지 알고 싶습니다. 아니면 문장을 잘못 해석 했습니까? 그리고 일반적인 예가 있다면 : 패턴 매칭과 정규 표현식이 더 적합한 이유는 무엇입니까?
루아 패턴 일치가 정규 표현식에 비해 "더 나은"일반적인 샘플이 있습니까?
Lua 패턴이 POSIX 정규식보다 신호 대 잡음비가 더 높기 때문에 특별한 예는 아닙니다. 특정 예가 아니라 종종 선호되는 전체 디자인입니다.
다음은 좋은 디자인에 기여하는 몇 가지 요소입니다.
대문자 (
%u
), 십진수 (%d
), 공백 문자 (%s
) 등을 포함한 일반적인 문자 유형을 일치시키기위한 매우 간단한 구문입니다 . 모든 문자 유형은 해당 대문자를 사용하여 보완 할 수 있으므로 패턴%S
은 공백이 아닌 문자와 일치합니다.인용은 매우 간단하고 규칙적입니다. 인용 문자는
%
이므로 항상 문자열 인용 문자\
와 구별되므로 (인용이 필요한 경우) POSIX 정규식보다 Lua 패턴을 훨씬 쉽게 읽을 수 있습니다. 기호를 인용하는 것은 항상 안전하며 문자를 인용 할 필요가 없으므로 특수 메타 문자가 무엇인지 기억하는 대신 경험 법칙을 따를 수 있습니다.Lua는 "캡처"를 제공하며
match
호출 결과로 여러 캡처를 반환 할 수 있습니다 . 이 인터페이스는 부작용을 통해 부분 문자열을 캡처하거나 캡처를 찾기 위해 조사해야하는 숨겨진 상태를 갖는 것보다 훨씬 낫습니다. 캡처 구문은 간단합니다. 괄호 만 사용하면됩니다.Lua에는
-
"가장 긴 일치"*
연산자 와 함께 사용할 "가장 짧은 일치" 수정자가 있습니다. 따라서 예를 들어s:find '%s(%S-)%.'
앞에 공백이 있고 뒤에 점이 오는 공백이 아닌 문자의 가장 짧은 시퀀스 를 찾습니다.Lua 패턴의 표현력은 대체 연산자가없는 POSIX "기본"정규식과 비슷합니다
|
. 당신이 포기하고있는 것은|
. 그 정도의 표현력이 필요하다면 필자는 LPEG로 가는 것을 추천합니다. LPEG 는 본질적으로 상당히 합리적인 비용으로 문맥없는 문법의 힘을 제공합니다.
http://lua-users.org/wiki/LibrariesAndBindings 에는 계속 사용하려는 경우 regex 라이브러리를 포함한 기능 목록이 포함되어 있습니다.
질문에 답하기 위해 (그리고 내가 Lua 전문가가 아니라는 점에 유의하십시오)이 언어는 임베디드 애플리케이션에서 사용되는 강력한 전통을 가지고 있습니다. 여기서 전체 정규식 엔진은 플랫폼에서 사용되는 코드의 크기를 과도하게 증가시킵니다. , 때로는 모든 Lua 라이브러리 자체보다 훨씬 큽니다.
[편집] 루아의 프로그래밍 온라인 버전 (언어 학습을위한 훌륭한 리소스)에서이 내용이 언어 원칙 중 하나로 설명되어 있음을 발견했습니다. 아래 설명을 참조하십시오. [/ 편집]
개인적으로 Lua가 제공하는 기본 패턴 일치가 내 정규식 요구 사항의 대부분을 충족한다는 것을 알게되었습니다. 귀하의 마일리지가 다를 수 있습니다.
좋아요,이 토론에 대한 약간의 멍청한 메모입니다. 특히이 페이지에서 혼란 스러웠습니다.
\s
다른 정규식 구문에서 알 수 있듯이 그 중 하나가 공백과 일치 한다고 말했기 때문에 ... 그래서 쉘에서 시도하고 있습니다.
$ lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c=" d"
> print(c:match(" "))
> print(c:match("."))
> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_ _
> print("_".. c:match("[\s]*") .."_")
__
흠 ... \s
여기에서 인식되지 않는 것 같습니다. 따라서 페이지는 아마도 Scite의 찾기 / 바꾸기의 정규식을 참조 할 것입니다. Lua의 정규식 구문 (scite도 사용함)이 아닙니다.
그럼 난 다시 읽어 패턴 자습서 : 루아 사용자가 위키 및 이스케이프 문자의 존재에 대한 코멘트를 받기 시작 %
하지 \
에서 @NormanRamsey 의 대답을. 그래서 이것을 시도하십시오 :
> print("_".. c:match("[%s]*") .."_")
_ _
... 실제로 작동합니다.
그래서 원래 Lua의 "패턴"이 Lua의 "정규식"과 다른 명령 / 엔진이라고 생각했기 때문에 더 나은 방법은 다음과 같습니다. Lua의 "패턴" 은 Lua 고유의 "정규식"구문 / 엔진입니다 ( 즉, 두 개가 없습니다 :)
)
건배!
참고 URL : https://stackoverflow.com/questions/2693334/lua-pattern-matching-vs-regular-expressions
'Program Tip' 카테고리의 다른 글
Java에서 메소드 숨김이란 무엇입니까? (0) | 2020.11.29 |
---|---|
Interface Builder가 drawRect를 재정의하지 않는 IBDesignable 뷰를 렌더링하는 방법이 있습니까? (0) | 2020.11.29 |
DAO 및 서비스 계층 (JPA / Hibernate + Spring) (0) | 2020.11.28 |
'this'는 JavaScript 클래스 메서드에서 정의되지 않았습니다. (0) | 2020.11.28 |
Java에서 패키지 개인 클래스의 장단점? (0) | 2020.11.28 |