2008-10-03 6 views
19

문자열에서 이름/값 쌍을 구문 분석하기 위해 정규 표현식을 제공 할 수 있습니까? 쌍은 쉼표로 구분되며, 값은 선택적으로 따옴표로 묶을 수 있습니다. 예를 들면 :이름 값 쌍을 파싱하는 정규식

AssemblyName=foo.dll,ClassName="SomeClass",Parameters="Some,Parameters" 

답변

35
  • 탈출하지 :

    /((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/ 
    
    key=value,"key with "" in it"="value with "" in it",key=value" "with" "spaces 
    
  • 백업합니다 : 키와 값 모두

    /([^=,]*)=("[^"]*"|[^,"]*)/ 
    
  • 따옴표 탈출 속눈썹 문자열 회피 :

    /([^=,]*)=("(?:\\.|[^"\\]+)*"|[^,"]*)/ 
    
    key=value,key="value",key="val\"ue" 
    
  • 전체 백 슬래시 이스케이프 :

    /((?:\\.|[^=,]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^,"\\]+)*)/ 
    
    key=value,key="value",key="val\"ue",ke\,y=val\,ue 
    

편집 : 추가 탈출 대안.

편집 2 : 다른 탈출 대안을 추가했습니다.

이스케이프 문자 및 주위 인용 부호를 제거하여 키/값을 정리해야합니다.

+0

내 간단한 시나리오에서 작동합니다. 하지만, 이중 따옴표 ("") 또는 백 슬래시 (\ ")를 사용하여 값을 인용 부호로 묶는 것이 좋을 수도 있습니다. –

+0

제발 도와주세요. 비슷한 것이지만 json http와 더 비슷한 것이 필요합니다. : //stackoverflow.com/questions/6099891/json-text-split-reg-expression-or-parser – Val

+0

key = value & key = value에 대한 정규식은 어디입니까? key 또는 value는 null 일 수 있으며, key 및 value는 임의 일 수 있습니다. – virsha

2

좋은 대답은 MizardX입니다. 사소한 중독 - 이름 등 (공란은 아님) 주위의 공백을 허용하지 않으며 따옴표로 묶은 값 (중요하지 않을 수도 있음)과 따옴표를 수집하며 포함을위한 이스케이프 메커니즘이 없습니다 따옴표로 묶인 값의 큰 따옴표 문자 (한 번 더 중요하지 않음).

작성된대로이 패턴은 대부분의 확장 정규 표현식 시스템에서 작동합니다. niggles를 고치려면 아마도 Perl을 사용해야 할 것입니다.

/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/ 
: 그러므로 = "A" "B '는"B "는 필드 값 생성"'(완벽하지,하지만 나중에 충분히 쉽게 고정 할 수 있음) -이 버전은 탈출 따옴표를 두 배로 사용합니다

또한 MizardX의 대답을 사용하면 $ 2 또는 $ 3을 사용하여 값을 수집해야합니다. 그래서, 쉽지도 좋지는 않지만 몇 가지 엣지 경우를 다룹니다. 간단한 대답이 적절한 경우 사용하십시오.

테스트 스크립트 :

#!/bin/perl -w 

use strict; 
my $qr = qr/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/; 

while (<>) 
{ 
    while (m/$qr/) 
    { 
     print "1= $1, 2 = $2, 3 = $3\n"; 
     $_ =~ s/$qr//; 
    } 
} 

이 중 하나를 $ 2 또는 $ 3 정의되지 않은 것에 대해 witters - 정확하게.

0

Perl 5.10을 사용할 수 있다면 이렇게 할 수 있습니다.

 
qr/ 
    (?<key> 
    (?: 
     [^=,\\] 
    | 
     (?&escape) 
    )++ # Prevent null keys 
) 

    \s*+ 
    = 
    \s*+ 

    (?<value> 
    (?&quoted) 
    | 
    (?: 
     [^=,\s\\] 
    | 
     (?&escape) 
    )++ # Prevent null value (use quotes for that) 
) 

    (?(DEFINE) 
    (?<escape>\\.) 
    (?<quoted> 
     " 
     (?: 
      (?&escaped) 
     | 
      [^"\\] 
     )*+ 
     " 
    ) 
) 
/x 

요소는 %+을 통해 액세스됩니다.

perlretut이 대답을 만드는 데 매우 도움이되었습니다.

관련 문제