2012-11-05 2 views
6

내 정규 표현식과 일치하는 시퀀스가 ​​공백으로 묶인 문자열의 중간에 있거나 끝나거나 처음에 있거나 문자열에서 유일한 것이어야하는 시퀀스를 찾고 싶습니다.Perl 정규 표현식을 사용하여 문자열의 끝이나 시작 부분에서 공백으로 단어를 일치시키는 방법은 무엇입니까?

예 : 시퀀스 'qwe45rty'이 우리가 찾고있는 것으로 가정 해 보겠습니다. 나는이 모든 문자열에 긍정적 얻을 수 있기를 원하는 :

'qwe45rty''qwe45rty blabla''smth qwe45rty blabla''smth qwe45rty'' qwe45rty '

그러나이 중 어느 것도 :

'aaqwe45rty''qwe45rtybb''aaqwe45rtybb'

이 내가 생각 해낸없는 최저 이 같은 smth :

if (($a =~ /\s+$re\s+/) or 
    ($a =~ /^$re\s+/) or 
    ($a =~ /\s+$re$/) or 
    ($a =~ /^$re$/)  ) 
{ 
    # do stuff 
} 

그럴 수있는 가장 좋은 방법이 될 수 없습니다 :)

어떤 제안이 있습니까? 예를 들어

$a =~ /(?:\A|\s)$re(?:\s|\Z)/; 

:

답변

17

당신이 할 수있는 또는 정규 표현식 내부 :

/(^|\s+)qwe45rty(\s+|$)/ 
+1

정규식 내부에서'또는'에 대해 알고 있지만, 문자열 앵커'^'와'$'는 그런 식으로 사용할 수 없다고 생각했습니다. – bazzilic

+2

@bazzilic 그런 식으로 아무 문제없이 앵커를 사용했습니다. 유일한 문제는 일치 목적으로 괄호를 사용하는 경우 괄호가 개수에 더해지는 것입니다. '(? :^| \ s +)'를 사용하여이 문제를 해결할 수 있습니다. –

+0

당신의 해결책을 골랐어 요, 문자열 앵커가 Perl 정규 표현식의 다른 제어 시퀀스로 사용될 수 있다는 것을 지적 해 주셔서 감사합니다! – bazzilic

1

는 다음 시도

use strict; 
use warnings; 

my $re = 'qwe45rty'; 
while (<DATA>) { 
    chomp; 
    print "'$_': Match? " . (/(?:\A|\s)$re(?:\s|\Z)/ ? 'Yes' : 'No') . "\n"; 
} 

__DATA__ 
qwe45rty 
qwe45rty blabla 
smth qwe45rty blabla 
smth qwe45rty 
qwe45rty 
aaqwe45rty 
qwe45rtybb 
aaqwe45rtybb 

출력 :

'qwe45rty': Match? Yes 
'qwe45rty blabla': Match? Yes 
'smth qwe45rty blabla': Match? Yes 
'smth qwe45rty': Match? Yes 
' qwe45rty ': Match? Yes 
'aaqwe45rty': Match? No 
'qwe45rtybb': Match? No 
'aaqwe45rtybb': Match? No 
+1

단어 경계가 항상 해결책은 아닙니다. '$ re'가'[a-zA-Z0-9! ~]'이면? – bazzilic

+1

@bazzilic - 탁월한 캐치! 원래의'$ a = ~/\ bqwe45rty \ b; '가 당신의 캐릭터 세트와 함께 실패 할 것입니다. 이걸 내 관심을 가져 주셔서 감사합니다. 수정 된 정규식은 더 강력합니다. – Kenosis

+0

사실 이것은 @AndreKR이 제안한 것이지만'(? : ...) '에게 감사드립니다. 이전에는 익숙하지 않았습니다. 유능한! – bazzilic

6

다른 방향에서 문제를 직접 시도해보십시오. 뭔가 일치 공백 또는 아무것도를 말하는 것은 는 공백이 아닌 문자와 일치 할 수없는 말을하는 것입니다 :

(?<!\S)qwe45rty(?!\S) 

그냥 관점에 약간의 변화와 정규식 실질적으로 자신을 씁니다.

+0

이것은 훌륭합니다, 앨런. – Kenosis

+0

그래, 펄 최고 - 팀버님 :) 제안 해 주셔서 감사합니다! – bazzilic

관련 문제