RE_FORMAT(7)

명칭
re_format - POSIX 1003.2 정규 표현

해설
p1003.2 에 두어 정의되고 있도록(듯이), 정규 표현 (“RE”) 에는 2 개의 형식이 있습니다. 하나는 현대 정규 표현 (대략적으로 말하면(자) egrep(1) 그리고 사용되고 있는 것으로, 1003.2 에서의 “확장” 정규 표현) 그리고, 또 하나는 구식 정규 표현 (이것도 대략적으로는 ed(1) 그리고 사용되고 있는 것으로, 1003.2 에서의 “기본” 정규 표현)입니다. 구식 정규 표현은 대체로의 경우 몇개의 옛부터 있는 프로그램에서의 구버젼과의 호환성을 위해서(때문에) 존재하고 있습니다. 이것에 대해서는 마지막에 설명합니다. p1003.2 (은)는 정규 표현의 구문과 의미의 몇개의 부분을 명확하게 정하지 않는 채에 하고 있습니다. 다른 p1003.2 의 실장과는 완전한 호환성이 없을지도 모른다 이러한 부분에 대해서는,`‡'에 의해 표를 붙여 가리킵니다.

정규 표현 (현대 정규 표현)은 하나‡ 혹은 그 이상의 하늘이 아니다‡ 가지 (branch) (을)를 ‘|’ 에 의해 단락지은 것입니다. 몇개의 가지에 매치 하면(자) 정규 표현은 성냥 합니다.

가지는 하나‡이상의 부분 (piece) 하지만 결합된 것입니다. 가지는 최초의 부분, 다음의 부분...(와)과 모든 것이 매치 한 것에 성냥 합니다.

부분은 아톰 (atom) , 혹은 거기에 단일의 ‡ ‘*’, ‘+’, ‘?’ 인가 area (bound) 중 한쪽이 계속된 것입니다. 아톰에게 ‘*’ 하지만 계속된 것은, 그 아톰의 0 개 이상의 순차 순서에 매치 합니다. 아톰에게 ‘+’ 하지만 계속된 것은, 그 아톰 1 개 이상의 순차 순서에 매치 합니다. 아톰에게 ‘?’ 하지만 계속된 것은, 그 아톰의 0 개나 1 개의 순차 순서에 매치 합니다.

area 하 ‘{’ 그리고 시작되어, 부호 없음의 10 진수의 정수가 계속되어, 그 다음에 ‘’, 하지만 계속되는 일이 있어, 또 그 다음에 또 하나 부호 없음의 10 진수의 정수가 계속되는 일이 있어, 마지막에는 항상 ‘}’ 하지만 계속됩니다. 여기서의 정수는 0 으로부터 RE_DUP_MAX (255‡)의 범위 (이러한 수치를 포함한다)(이)가 아니면 안되어, 수치가 2 개 있는 경우는, 최초의 것은 2 번째의 것 이하가 아니면 안됩니다. 하나의 정수치 i 하지만 포함되고 콤마가 포함되지 않는 area가 아톰에게 계속되면(자), 아톰이 정확히 i 개의 순차 순서에 매치 합니다. 하나의 정수치 i (와)과 콤마가 포함되는 area가 아톰에게 계속되면(자), i 개이상의 아톰의 순차 순서에 매치 합니다. 2 개의 정수치 i (와)과 j 하지만 포함되는 area가 아톰에게 계속되면(자), i 개이상 j 개이하의 아톰으로부터 되는 순차 순서에 매치 합니다.

아톰은 다음의 머지않아인가입니다: ‘()’ 에 둘러싸인 정규 표현 (그 정규 표현에 매치), ‘()’ 의 하늘세트 (누르스트링에 매치)‡, 꺽쇄묶음식 (아래와 같이 참조), ‘.’ (임의의 1 캐릭터에 매치), ‘^’ (행의 선두의 누르스트링에 매치), ‘$’ (행의 말미의 누르스트링에 매치), ‘\’ (와)과 거기에 계속된다 ‘^. [$()|*+? {\’ 중의 어떤 것이나 1 캐릭터 (그러한 통상의 취급에서의 캐릭터에 매치), ‘\’ (와)과 거기에 계속되는 그 외의 캐릭터‡ (그러한 통상의 취급에서의 캐릭터에 매치, ‘\’ 하지만 없는 경우와 같이‡), 혹은 그 외에 아무것도 지정되어 있지 않은 캐릭터 (그 캐릭터에 매치). ‘{’ 에 숫자 이외의 캐릭터가 계속되는 것은 통상의 캐릭터이며, area의 개시는 되지 않습니다‡. ‘\’ 그리고 종료하는 정규 표현은 규칙 위반이 됩니다.

꺽쇄묶음식 (bracket expression) (이)란 ‘[]’ 그리고 둘러싸인 캐릭터의 리스트입니다. 통상은 리스트중의 어떤 것이나 1 캐릭터에 매치 합니다 (아래와 같이를 제외하다). 리스트의 최초가 ‘^’ 그리고 시작되는 경우, 리스트의 나머지의 캐릭터 가 아니다 1 캐릭터에 매치 합니다 (아래와 같이를 제외하다). 리스트중의 2 캐릭터가 ‘-’ 그리고 분할되고 있는 경우는, 이것들 2 캐릭터의 범위 (그 2 캐릭터를 포함한다)에 있는 캐릭터의 생략형이 되어, 예를 들면 ASCII 에서는 ‘[0-9]’ (은)는 10 진수 숫자에 매치 합니다. ‘a-c-e’ (와)과 같이 2 개의 캐릭터 범위가 하나의 캐릭터를 공유할 수 없습니다‡. 캐릭터 범위는 문자 코드의 배열에 매우 의존하고 있어, 이식성이 좋은 프로그램을 쓰려면 이것에 의지하는 것을 피하는 것이 현명하겠지요.

리스트중에 캐릭터 ‘’] (을)를 포함하려면 , 이것을 최초의 캐릭터로 한다 (혹은 ‘^’ 에 잇는 것) 같게 합니다. 캐릭터 ‘-’ (을)를 포함하려면 , 이것을 최초 혹은 마지막 캐릭터로 하는지, 캐릭터 범위의 종료 캐릭터로 합니다. 캐릭터 ‘-’ (을)를 캐릭터 범위의 개시 캐릭터로 하려면 , 이것을 연속 요소와 하기 위해서 ‘[.’ (와)과 ‘’.] 그리고 괄 (아래와 같이 참조). 이것들과 ‘[’ (을)를 사용하고 싶은 구두인가의 편성의 예외를 제외해, ‘\’ (을)를 포함한 모든 다른 특수 캐릭터는 꺽쇄묶음식 중(안)에서는 그러한 특수한 작용은 무효가 됩니다.

꺽쇄묶음식 중(안)에서는, 연속 요소 (캐릭터, 1 캐릭터와 같이 다루어지는 복수 캐릭터로부터 되는 순차 순서, 또는 그것들 연속 순차 순서의 명칭)은, ‘[.’ (와)과 ‘’.] 그리고 괄, 그 연속 요소의 캐릭터의 순차 순서의 의미가 됩니다. 이 순차 순서는 꺽쇄묶음식의 리스트의 하나의 요소가 됩니다. 복수 캐릭터로부터 되는 연속 요소를 포함한 꺽쇄묶음식은 이와 같이 1 캐릭터 이상의 것에 매치 할 수가 있습니다. 예를 들면, 연속 순차 순서가 연속 요소로서 ‘ch’ (을)를 포함한 경우, 정규 표현 ‘[[.ch. ]]*c’ 하 ‘chchcc’ 의 최초의 5 캐릭터에 매치 합니다.

꺽쇄묶음식 중(안)에서는, ‘[=’ (와)과 ‘=]’ 그리고 둘러싸인 연속 요소는 하나의 등가 클래스이며, 그것 자신을 포함한 모든 연속 요소의 캐릭터의 순차 순서를 나타내고 있습니다. (만약 그 외에 등가인 연속 요소가 없는 경우는, 그것은 그것을 둘러싸는 것이 ‘[.’ (와)과 ‘’.] 이지만 같게 다루어집니다. ) 예를 들면, ‘x’ (와)과 ‘y’ 하지만 등가 클래스의 멤버일 때, ‘[[=x=]]’ (와)과 ‘[[=y=]]’ (와)과 ‘[xy]’ (은)는 모두 같은 의미를 가집니다. 등가 클래스는 캐릭터 범위의 종료점으로 할 수 없습니다‡.

꺽쇄묶음식 중(안)에서는, ‘[:’ (와)과 ‘:]’ 그리고 둘러싸였다 캐릭터 클래스 의 명칭은 그 클래스에 속하는 모든 캐릭터의 리스트를 나타냅니다. 표준의 캐릭터 클래스의 명칭에는 다음의 것이 있습니다.

alnum | digit | punct
alpha | graph | space
blank | lower | upper
cntrl | print | xdigit

이것들은 ctype(3) 에 두어 정의되고 있는 캐릭터 클래스를 나타내고 있습니다. 로케일에 따라서는 이것들 이외의 것이 있는 일이 있습니다. 캐릭터 클래스는 캐릭터 범위의 종료점으로서 사용할 수 없습니다.

꺽쇄묶음식에는 2 개의 특수한 케이스‡가 있습니다. 꺽쇄묶음식 ‘[[:<:]]’ (와)과 ‘[[:>:]]’ (은)는 각각 단어의 개시 및 종료점에 둘 수 있는 누르스트링에 매치 합니다. 단어는 단어 캐릭터가 전에도 후에도 부가되지 않는다 단어 캐릭터의 순차 순서로서 정의됩니다. 단어 캐릭터는 alnum (알파벳과 숫자) 캐릭터 ( ctype(3) 그리고 정의되고 있도록(듯이))인가 밑줄 캐릭터입니다. 이것은 확장해 정의되고 있는 것으로, p1003.2 에 호환성은 있습니다만, 지정은 되고 있지 않습니다. 이 확장은 소프트웨어에 대해서는, 다른 시스템에의 이식성을 잘 생각해 사용해야 합니다.

주어진 캐릭터 라인의 복수의 substring (캐릭터 라인의 일부) 에, 어느 정규 표현이 매치 가능한 경우, 그 정규 표현은 캐릭터 라인 중(안)에서 최초로 나타난 것에 매치 합니다. 만약 정규 표현이 같은 위치에 나타난 복수의 substring에 매치 하는 경우는, 가장 긴 것에 매치 합니다. 서브식 (subexpression - 식의 일부)도 가장 긴 substring에 매치 합니다만, 매치 전체가 가장 길어지도록(듯이), 또 정규 표현중에서 먼저 개시하고 있는 서브식이 늦게 개시하고 있는 것보다 높은 우선도를 가지는 것 같은 조건이 있습니다. 높은 레벨의 서브식은 이 때문에 낮은 레벨의 부품적인 서브식보다 높은 우선도를 가집니다.

매치의 길이는 연속 요소가 아니고, 캐릭터수로 재어집니다. 누르스트링은 전혀 매치 하지 않는 것보다는 긴 것으로 있다고 생각됩니다. 예를 들면, ‘bb*’ 하 ‘abbbc’ 의 3 살의 한가운데의 캐릭터에 매치 해, ‘(wee|week)(knights|nights)’ 하 ‘weeknights’ 의 10 개 모든 캐릭터에 매치 해, ‘(. *). *’ 하지만 ‘abc’ 에 매치 할 때에는, 괄호로 둘러싸인 서브식은 3 개(살) 모든 캐릭터에 매치 합니다. 그리고 ‘(a*)*’ 하지만 ‘bc’ 에 매치 할 때에는, 정규 표현 전체와 괄호로 둘러싸인 서브식의 양쪽 모두가 누르스트링에 매치 합니다.

케이스 (대문자/소문자) 비의존 매치가 지정되었을 경우, 알파벳으로부터 케이스의 구별이 모두 사라진 것 같은 효과가 있습니다. 케이스가 다수 있는 알파벳이 꺽쇄묶음식의 밖에 통상의 캐릭터로서 나타났을 때, 그것은 사실상 모든 케이스를 포함한 꺽쇄묶음식 (예를 들어 ‘x’ 하 ‘[xX]’ 에) 에 변환됩니다. 꺽쇄묶음식안에 나타났을 때는, 그 캐릭터가 다른 케이스가 그 꺽쇄묶음식에 추가됩니다. 즉 ‘[x]’ 하 ‘[xX]’ 되어, 또 ‘[^x]’ 하 ‘[^xX]’ 됩니다.

정규 표현의 길이는 특히 제한은 설치되고 있지 않습니다‡. 프로그램에 이식성을 갖게하고 싶은 경우는 정규 표현은 256 바이트에 그쳐야 하는 것이지요. 256 바이트를 넘는 정규 표현의 수리를 거부하는 것에도 불구하고, POSIX 준거이다고 하는 실장이 있을 수 있는으로부터입니다.

구식 (“기본”) 정규 표현은 몇개의 점으로 차이가 납니다. ‘|’ (은)는 통상의 캐릭터이며, 이러한 기능의 등가인 물건은 존재하지 않습니다. ‘+’ (이)나 ‘?’ (은)는 통상의 캐릭터이며, 그러한 기능은 area를 이용해 나타내집니다 (각각 ‘{1,}’ 또는 ‘{0,1}).’ 또, 현대 정규 표현의 ‘x+’ 하 ‘xx*’ (와)과 등가인 것에 주의해 주세요. area의 단락 캐릭터는 ‘\{’ (와)과 ‘\}’ (이어)여, ‘{’ (와)과 ‘}’ (은)는 통상의 캐릭터로서 다루어집니다. 네스트 한 서브식에서의 괄호는 ‘\(’ (와)과 ‘\)’ (이어)여, ‘(’ (와)과 ‘’) (은)는 통상의 캐릭터가 됩니다. ‘^’ (은)는 정규 표현의 선두, 혹은‡ 괄호로 둘러싸인 서브식의 선두를 제외해 통상의 캐릭터가 되어, ‘$’ (은)는 정규 표현의 말미, 혹은‡ 괄호로 둘러싸인 서브식의 말미를 제외해 통상의 캐릭터가 되어, ‘*’ (은)는 만약 이것이 정규 표현의 선두, 혹은 괄호로 둘러싸인 서브식의 선두 (인가, 선두의 ‘^’ 의 나머지)에 나타나면(자) 통상의 캐릭터가 됩니다. 마지막에 하나 새로운 형태의 아톰 - 후방 참조 (이)가 있습니다. ‘\’ 에 0 이 아닌 10 진수 d 하지만 계속된 것은, d 번째의 괄호로 둘러싸인 서브식에 의해 매치 하는 캐릭터의 같다 순차 순서에 매치 합니다 (열림 괄호의 위치에 의해 왼쪽에서 오른쪽에 서브식에 번호를 붙입니다). 즉 ‘\([bc]\) \1’ 하 ‘bb’ (이)나 ‘cc’ 에 매치 합니다만, ‘bc’ 에는 매치 하지 않습니다.

관련 항목
regex(3) Regular Expression Notation, IEEE Std, 1003.2, section 2.8.

버그
정규 표현이 2 종류도 있는 것은 눈치가 없는 일입니다.

현재의 p1003.2 사양에서는 ‘’) (은)는 매치 한다 ‘(’ 하지만 없는 경우에 보통 캐릭터로서 다루어지게 되어 있습니다. 이것은 표현상의 잘못의 의도하지 않는 결과이며, 변경될 가능성이 있습니다. 따라서, 이 사양에 의존해야 하지는 않습니다.

후방 참조는 심한 눈치가 없고, 효율적인 실장을 행하는데 있어서 큰 문제를 일으킵니다. 게다가 그러한 정의는 어딘가 애매합니다. ( ‘a\(\(b\) *\2\) *d’ 하 ‘abbbd’ 에 매치 할까요 ? ) 이것들을 사용하는 것은 피해 주세요.

p1003.2 의 케이스비의존 매치의 사양은 애매합니다. 상기에서의 “하나의 케이스는 모든 케이스를 나타낸다” 그렇다고 하는 정의는 실장을 실시한 것의 동안에서는 올바른 해석으로서 현재 동의 되고 있는 것입니다.

말의 경계의 구문은 믿을 수 없을 정도 추악한 것입니다.