2011-10-20 80 views
0

如何檢測一個字符串是否包含例如我的名字,但不包含僅使用正則表達式的姓氏?正則表達式查找一個單詞但不是另一個

+0

這其實很簡單。閱讀這個簡單的REGEX教程,它很好地涵蓋了這一點。 http://www.codeproject.com/KB/dotnet/regextutorial.aspx – CamelSlack

+5

你不需要這樣的正則表達式。只要執行'str.contains(first_name)&&!str.contains(last_name)' – NullUserException

+4

您應該始終指定使用正則表達式的語言。它甚至寫在標籤中。每種語言都以不同的方式實現正則表達式。 – xanatos

回答

4

爲此使用正則表達式的最簡單方法是使用簡單的正則表達式和邏輯連接詞。既然你只想要簡單的比賽,因爲你沒有列出的語言,這裏是Perl中的一個基本的實現:

my $str1="firstname lastname blah blah blah"; 
my $str2="blurg firstname etc"; 

foreach($str1,$str2) 
{ 
    if(/firstname/ and !/lastname/) 
    { 
    print "$_ matched firstname and not lastname!\n"; 
    } 
    else 
    { 
    print "No match for $_\n"; 
    } 
} 

正如預期的那樣,輸出爲:

No match for firstname lastname blah blah blah 
blurg firstname etc matched firstname and not lastname! 
1
^(?=.*firstname)(?=.*lastname) 

與許多正則表達式版本,你可以做這樣的事情。我使用零寬度向前搜索您的名字和姓氏。它們不會「移動」正則表達式遊標,因此兩者都從第一個字符開始掃描。如果名字或姓氏不存在,則正則表達式將失敗。

嚴重的是,正則表達式應該是比較複雜的,否則你可能有下列情形:

firstname = `name` 
lastname = `lastname` 

lastname // ok with the given rules 

firstname = `firstname` 
lastname = `lastname` 

firstnamelastname // ok with the given rules, even without the space 
xfirstnamex xlastnamex // ok with the given rules 

正則表達式將需要:

^(.*\bfirstname\b.*\blastname\b)|(.*\blastname\b.*\bfirstname\b) 

因此檢查名字和姓氏的兩個命令,並檢查之前是否有詞分隔符並在名字和姓氏之後。

我會補充一點,我已經展示的東西不是做完美的例子。你想用戶正則表達式?你不要!首先,您嘗試使用您的語言的字符串函數。那麼,如果他們失敗了,你可以嘗試使用正則表達式。

+0

雖然這不會處理''lastname firstname''的情況。 – 2011-10-20 17:51:00

+0

@JackManey你可以想想你想要什麼,但它會處理它。 http://gskinner.com/RegExr/?2uvv1它還有其他問題。 – xanatos

+0

@JackManey問題是'firstnamelastname'會被認爲是正確的,或者如果你的名字是'name'而你的姓氏是'lastname'那麼'lastname'會好的('lastname'包含'name'和'lastname') – xanatos

1

如何:

#!/usr/bin/perl 
use Modern::Perl; 

while (<DATA>) { 
    chomp; 
    say /^(?=.*\bfirstname\b)(?!.*\blastname\b)/ ? "OK : $_" : "KO : $_"; 
} 

__DATA__ 
jhjg firstname jkhkjh lastname kljh 
jhgj lastname kjhjk firstname kjhkjh 
jhgdf firstname sjhdfg not_my_lastname 
jshgdf no_my_lastname jhg firstname jkhghg 

輸出:

KO : jhjg firstname jkhkjh lastname kljh 
KO : jhgj lastname kjhjk firstname kjhkjh 
OK : jhgdf firstname sjhdfg not_my_lastname 
OK : jshgdf no_my_lastname jhg firstname jkhghg 
相關問題