2012-03-07 6 views
5

서식 문서를 만들어야합니다. 나는 텍스트를 포맷하는 데 사용되는 정규식을 알고 있지만 그 정규식에 대한 예제를 재현하는 방법을 모르겠습니다.정규식과 일치하는 문자열을 어떻게 만듭니 까?

'{\[((?:\#|/)[^ ]*) ([^]]*)\]}' 

사람이 일치하는, 어쩌면 그가 그것을 가지고 어떻게 설명 할 예제를 만들 수 있습니다 이 하나는 내부 연결해야합니다. 나는 '에 붙어있어?'.

처음에는이 메타 문자를 사용하지 않았습니다. 대개 리터럴이 표시되거나 정확히 한 번만 표시 될 수 있다는 것을 표시하기 위해이 메타 문자를 사용합니다.

감사

답변

3

(?:...)(...) 동일한 그룹핑 효과가 있지만없이 그룹의 내용을 "캡쳐"; http://php.net/manual/en/regexp.reference.subpatterns.php을 참조하십시오.

따라서 (?:\#|/)은 "# 또는 /"을 의미합니다.

나는 [^ ]*이 "SP가 아닌 0 개 이상의 문자"를 의미하고 [^]]*은 "0 개 이상의 문자가 오른쪽 대괄호가 아닌"것을 의미합니다.

것은 함께 퍼팅, 하나의 가능한 문자열은 이것이다 :

'{[/abcd asdfasefasdc]}' 
+0

작동 ... 감사 설명 및 설명서 –

+0

@ 알렉스에 대한 많은 : 천만에요을! – ruakh

3

몇 가지 유용한 도구에 대한 Open source RegexBuddy alternativesOnline regex testing를 참조하십시오. 정규식을 먼저 설명하는 것이 가장 쉽습니다. 여기 YAPE을 사용 :

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    \[      '[' 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
     \#      '#' 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    /      '/' 
---------------------------------------------------------------------- 
    )      end of grouping 
---------------------------------------------------------------------- 
    [^ ]*     any character except: ' ' (0 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
          ' ' 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    [^]]*     any character except: ']' (0 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \2 
---------------------------------------------------------------------- 
    \]      ']' 
---------------------------------------------------------------------- 

이것은 당신의 예에서 {}regex delimiters 있다는 가정 하에서이다.

당신은 단지 설명의 목록을 읽고 같은 가능한 소스 문자열을 마련 할 수

[#NOSPACE NOBRACKET] 
1

나는이 디자인 정규식을 도울 수있는 좋은 게시물입니다 생각합니다. 그것의 비교적 쉽게
문자열을 일치하는 일반적인 정규식을 작성하는 동안, 때로는 그것의 역순으로 후에 참조로
설계 도움이. 때로는 어떤 bizzar 것들이 일치 하는지를 볼 필요가 있습니다.

많은 메타 문자를 리터럴로 혼합하는 경우 읽기 쉽고 오류를 피하기 위해
을 이러한 형식으로 지정하는 것이 매우 중요합니다.

다음은 Perl에서 프로토 타입을 만드는 것이 더 쉽다는 샘플입니다.

my @samps = (
'{[/abcd asdfasefasdc]}', 
'{[# ]}', 
'{[# /# \/]}', 
'{[/# {[ 
    | /# {[#\/} ]}', 
, 
); 

for (@samps) { 
    if (m~{\[([#/][^ ]*) ([^]]*)\]}~) 
    { 
     print "Found: '$&'\ngrp1 = '$1'\ngrp2 = '$2'\n===========\n\n"; 
    } 
} 

__END__ 

Expanded 

\{\[ 
    (
    [#/][^ ]* 
) 
    [ ] 
    (
    [^\]]* 
) 
\]\} 

출력

Found: '{[/abcd asdfasefasdc]}' 
grp1 = '/abcd' 
grp2 = 'asdfasefasdc' 
=========== 

Found: '{[# ]}' 
grp1 = '#' 
grp2 = '' 
=========== 

Found: '{[# /# \/]}' 
grp1 = '#' 
grp2 = '/# \/' 
=========== 

Found: '{[/# {[ 
     | /# {[#\/}  ]}' 
grp1 = '/#  {[ 
     |' 
grp2 = '/# {[#\/}  ' 
=========== 
관련 문제