2010-06-07 1 views
0

문자열이 1/temperatoA,2/CelcieusB!23/33/44,55/66/77이고 temperatoACelcieusB이라는 단어를 추출하고 싶습니다. 정규 표현식을 사용하여 단어를 추출하십시오.

나는이 정규 표현식 (\d+/(\w+),?)*!을 가지고 있지만 난 단지 경기 1/temperatoA,2/CelcieusB!

이유를 얻을?

+0

어떤 정규식 엔진을 사용하고 있습니까? – Johnsyweb

+1

답변을 수락해야합니다. – 0x499602D2

답변

1

여기의 질문입니다 : 왜 분명히 틀린 정규식을 사용하고 있습니까? 어떻게 얻었 어?

다음과 같이 당신이 원하는 표현은 단순히 :

펄 호환 정규 표현식 엔진
(\w+) 
+0

나는 아무것도하지 않는다 – farka

+0

나는 정규 표현식을 사용한다. 나는 단지 온도와 셀시 어스만을 원한다. – farka

+1

@ farka : 표현식을 어떻게 사용하는지 보여주세요. 그것은 잘못된 표현이 아니며, 그것을 사용하는 방법입니다. –

1

당신이

(?<=\d/)\w+(?=.*!) 

(?<=\d/)이 자리하고 이전에 슬래시가 있다는 주장을 검색 할 수 있습니다 일치 항목의 시작

\w+이 식별자와 일치합니다. 이것은 글자, 숫자 및 밑줄을 허용합니다. 문자 만 허용하려면 대신 [A-Za-z]+을 사용하십시오.

(?=.*!)은 문자열 -i 앞에 !가 있다고 주장합니다. 이자형. 우리가 !을 통과하면 정규식은 실패 할 것이다.

사용하는 언어에 따라 정규 표현식의 일부 문자를 이스케이프 처리해야 할 수 있습니다. .

E. g,합니다 (PCRE 라이브러리) C에서 사용하기 위해, 당신은 백 슬래시를 이스케이프해야합니다

myregexp = pcre_compile("(?<=\\d/)\\w+(?=.*!)", 0, &error, &erroroffset, NULL); 
+0

나는 pcrl을 사용한다 perl comapatibe 정규 표현식 – farka

+0

어떤 프로그래밍 언어로? PCRE는 다양한 언어로 제공됩니다. 좋은 소식은 PCRE가 lookaround를 지원하기 때문에 정규식이 작동한다는 것입니다. –

+0

하지만 작동하지 않습니다 :-))) – farka

0

윌이 일을?

/([[:alpha:]]\w+)\b(?=.*!) 

은 내가 단어은 알파벳 문자로 시작하는 다음과 같은 가정 ...

  1. 했다.
  2. 단어는 항상 슬래시 다음에옵니다. 중간에 공백이없고 단어가 없습니다.
  3. 느낌표 뒤에 나오는 단어는 무시됩니다.
  4. 두 개 이상의 단어를 캡처하려면 일종의 루프가 있어야합니다. 예를 들기 위해 C 라이브러리에 익숙하지 않습니다.

[[:alpha:]]은 모든 영문자와 일치합니다.

\b은 단어 경계를 찾습니다.

(?=.*!)Tim Pietzcker's post입니다.

7

귀하의 전체 일치는 다음과 같은 표현과 일치하므로 '1/temperatoA,2/CelcieusB'로 평가

qr{ (  # begin group 
     \d+ # at least one digit 
    / # followed by a slash 
    (\w+) # followed by at least one word characters 
    ,?  # maybe a comma 
    )*  # ANY number of repetitions of this pattern. 
}x; 

'1/temperatoA,' 먼저 캡처 # 1을 충족,하지만 당신은 엔진을 요구하고 있기 때문에 그것을 할 수있는 사람들의 많은을 캡처 되돌아 가서 패턴이 '2/CelcieusB' (쉼표가 필요하지 않음)에서 반복되는 것을 찾습니다. 그래서 전체 경기는 그것이 무엇인지 당신이 말한 것입니다,하지만 당신은 아마 예상하지 않은 것은 '2/CelcieusB'$1'2/CelcieusB'를 읽고 그래서, $1으로'1/temperatoA,'을 대체한다는 것이다.

특정 문자열에서 특정 패턴에 맞는 것을 캡처하려는 경우 항상 *** g *** lobal 플래그를 사용하여 캡처에 배열을 할당하는 것이 가장 좋습니다. 배열은 $1과 같은 단일 스칼라가 아니므로 캡처 # 1에 대해 캡처 된 모든 값을 보유 할 수 있습니다. 나는이 작업을 수행 할 때

은 : 지금

$VAR1 = [ 
      '1/temperatoA', 
      'temperatoA', 
      '2/CelcieusB', 
      'CelcieusB', 
      '23/33', 
      '33', 
      '55/66', 
      '66' 
     ]; 

나는 당신이 기대했던 아마 피겨 :

my $str = '1/temperatoA,2/CelcieusB!23/33/44,55/66/77'; 
my $regex = qr{(\d+/(\w+))}; 
if (my @matches = $str =~ /$regex/g) { 
    print Dumper(\@matches); 
} 

내가이 얻을. 그러나 '3''6'이며 문자는입니다. 따라서 슬래시 뒤에 오는 것은 표현식을 준수합니다.

따라서 문제가되는 경우 정규 표현식을 qr{(\d+/(\p{Alpha}\w*))}으로 변경할 수 있습니다. 첫 번째 문자는 알파이고 그 뒤에 임의의 단어 문자 수를 지정해야합니다.

$VAR1 = [ 
      '1/temperatoA', 
      'temperatoA', 
      '2/CelcieusB', 
      'CelcieusB' 
     ]; 

을 그리고 당신은 단지 'temperatoA' 또는 'CelcieusB'를 원하는 경우에, 당신은 당신이 필요하고 당신이 당신의 정규식 qr{\d+/(\p{Alpha}\w*)}되고 싶은 것보다 더 포착하고 그런 다음 덤프는 다음과 같습니다.

그러나 캡처 식에서 두 개 이상의 청크를 캡처하는 비결은 배열에 일치 항목을 할당하는 것이므로 배열을 통해 정렬하여 원하는 데이터가 포함되어 있는지 확인할 수 있습니다.

+0

+1 이것은 내게 망할 훌륭한 설명 인 것처럼 보인다. – Mike