2011-10-20 13 views
0

たとえば、文字列にはファーストネームが含まれていますが、正規表現だけを使用している姓は検出できませんか?Regex単語を1つしか見つけることはできません

+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または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) 

firstnameとlastnameの両方の注文をチェックし、前に単語区切りがあることを確認するそしてfirstnameとlastnameの後に。

私が示したことは、事の完全な例であることを付け加えます。はありません。あなたは正規表現を使いたいですか?あなたはそうしない!まず、あなたの言語の文字列関数を使用しようとします。次に、失敗した場合、正規表現で試すことができます。

+0

これは '' lastname firstname "'の大文字と小文字を区別しません。 –

+0

@JackManeyあなたが望むものを考えることはできますが、それはそれを処理します。 http://gskinner.com/RegExr/?2uvv1その他の問題があります。 – xanatos

+0

@JackManey 'firstnamelastname'は正しいと見なされるか、firstnameが' name'で、あなたのlastnameが 'lastname'なら' lastname'はOKです( '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 
関連する問題