2012-11-05 13 views
6

Regexp ile eşleşen dizileri boşluklarla çevrili dizenin ortasında, sonunda veya başında veya dizideki tek şeyle eşleştirmek için bulmak istiyorum.Perl regexp kullanarak dizgenin sonuna/sonuna dizilerle boşluklu OR kelimesi nasıl eşlenir?

Örnek: dizisinin çok 'qwe45rty' biz aradığınızı olduğunu varsayalım. Bunları dizeleri tümü üzerinde olumlu elde edebilmek istiyorum:

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

Ama bunların hiçbiri:

'aaqwe45rty''qwe45rtybb''aaqwe45rtybb'

ne ile geldi Best Bunu beğenme:

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

bunun en iyi yolu olamaz :)

Herhangi bir öneriniz var mı? Örneğin

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

:

cevap

17

bunu yapabilirsiniz veya regex içine:

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

İntikamın içinde veya üstünde olduğunu biliyorum, ama dize tutturduğunu sanıyordum^'ve' $ 'bu şekilde kullanılamaz. – bazzilic

+2

@bazzilic Herhangi bir problem yaşamadan çapa kullanıyorum. Tek sorun, eşleşen amaçlar için parantez kullanıyorsanız, parantez sayınıza eklenecektir. Bu soruna geçici bir çözüm bulmak için '(?:^| \ S +)' kullanabilirsiniz. –

+0

Çözümünüzü aldım, dize çapalarının Perl regexlerinde diğer kontrol dizileri olarak kullanılabileceğine işaret ettiğin için teşekkürler! – bazzilic

1

izlemeyi deneyin

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 

Çıktı:

'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

Word sınırları her zaman çözüm değildir. Ya "$ re", [a-zA-Z0-9! ~] 'Ise? – bazzilic

+1

@bazzilic - Mükemmel yakalama! Orijinalim $ a = ~/\ bqwe45rty \ b; 'karakter kümenizle başarısız olur. Bu hususları dikkatime sunduğunuz için teşekkür ederim. Revize edilmiş regex daha sağlamdır. – Kenosis

+0

Aslında bu, @AndreKR'nin önerdiği şeydi, ama “(?: ...)' için teşekkürler. Daha önce hiç tanımadım. İşe yarar! – bazzilic

6

Soruna farklı bir yönden gelmeyi deneyin. şey can maç boşluk ya da hiçbir şey söylemek için o bir boşluk olmayan karakter maç olamaz demek ki:

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

Sadece perspektifte biraz kayma ve regex pratikte kendini yazar.

+0

Bu harika, Alan. – Kenosis

+0

Evet, Perl en iyi - TIMTOWTDI :) Öneriniz için teşekkürler! – bazzilic