web-dev-qa-db-ja.com

正規表現は単語全体にのみ一致します

データベースに格納されている用語集に含まれている、大文字と小文字を区別しないコンテンツの特定のブロック内のすべての単語を見つけるために使用している正規表現を持っています。これが私のパターンです:

/($Word)/i

問題は、/(Foo)/iを使用すると、Foodなどの単語が一致することです。 Wordの両側に空白またはWord境界が必要です。

文の先頭、中間、または末尾の単語である場合に、単語Fooのみに一致するように式を変更するにはどうすればよいですか?

76
Aaron

単語の境界を使用:

/\b($Word)\b/i

または、「S.P.E.C.T.R.E。」を検索している場合SinanÜnürの例のように:

/(?:\W|^)(\Q$Word\E)(?:\W|$)/i
99
Richard Simões

Word全体と一致させるには、(\w+)というパターンを使用します

PCREまたは類似のものを使用していると仮定します。

enter image description here

この実例から取られた上記のスクリーンショット: http://regex101.com/r/cU5lC2

コマンドラインでWord全体を(\w+)と一致させる

phpshインタラクティブシェル を使用して、 Ubuntu 12.10 をデモンストレーションします PCRE正規表現エンジンpreg_match として知られる方法

Phpshを起動し、いくつかのコンテンツを変数に入れて、Wordに一致させます。

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Preg_matchメソッドは、PHP言語内のPCREエンジンを使用して、変数を分析しました:$content1$content2および$content3パターンで(\w)+

$ content1と$ content2には少なくとも1つのWordが含まれますが、$ content3には含まれません。

(Dart|fart)を使用して、コマンドライン上のいくつかのリテラルワードを一致させます

el@apollo:~/foo$ phpsh

php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'Unicorn gun';

php> echo preg_match('(Dart|fart)', $gun1);
1

php> echo preg_match('(Dart|fart)', $gun2);
1

php> echo preg_match('(Dart|fart)', $gun3);
1

php> echo preg_match('(Dart|fart)', $gun4);
0

変数gun1およびgun2には、文字列Dartまたはfartが含まれています。 gun4はしません。ただし、Word fartを検索するとfartyと一致することが問題になる場合があります。これを修正するには、正規表現でWordの境界を強制します。

コマンドラインのリテラルワードとワード境界を一致させます。

el@apollo:~/foo$ phpsh

php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'Unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

そのため、Word fart\b Word境界が含まれるコンテンツがfartyに存在しないことを除いて、前の例と同じです。

36
Eric Leschinski

\bを使用すると、驚くべき結果が得られます。 Wordとその定義を区別するものを把握し、その情報をパターンに組み込む方が良いでしょう。

#!/usr/bin/Perl

use strict; use warnings;

use re 'debug';

my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';

my $Word = 'S.P.E.C.T.R.E.';

if ( $str =~ /\b(\Q$Word\E)\b/ ) {
    print $1, "\n";
}

出力:

コンパイルREx "\ b(S\.P\.E\.C\.T\.R\.E \。)\ b" 
最終プログラム:
 1 :BOUND(2)
 2:OPEN1(4)
 4:EXACT(9)
 9:CLOSE1(11)
 11:BOUND(12)
 12:END(0)
 anchored "SPECTRE" at 0(アンカーのチェック)stclass BOUND minlen 14 
 RExのsvでの一致の開始の推測 "\ b(S\.P\.E\.C\.T\.R\.E \。)\ b "に対して" SP 
。ECTRE(反知能のための特別執行部)、... 
オフセット0 ... 
 start_shift:0 check_atでアンカーされたsubstr "SPECTRE"を発見:0 s:0 endpos:1 
 STCLASSと矛盾しない... 
推測:オフセット0で一致する
 RExのマッチング "\ b(S\.P\.E\.C\.T\.R\.E \。)\ b "に対して" SPECTRE(Special Exec 
 utive for Counter-intelligence、 "... 
 0 | 1:BOUND(2 )
 0 | 2:OPEN1(4)
 0 | 4:EXACT(9)
 14 | 9:CLOSE1(11)
 14 | 11:BOUND (12)
 failed ... 
 Match failed 
 RExの解放: "\ b(S\.P\.E\.C\.T\.R\.E \。)\ b "
8
Sinan Ünür

単語の境界を使用する\ b、

次の(4つのエスケープを使用)は私の環境で動作します:Mac、safariバージョン10.0.3(12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
1
X. L

Notepad ++で実行している場合

[\w]+ 

Word全体を提供します。括弧を追加して、グループとして取得できます。例:conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)LeakyReLUをコメントとして独自の行に移動し、現在のアクティベーションを置き換えたいと思います。 notepad ++では、これはfollow findコマンドを使用して実行できます。

([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)

そして、replaceコマンドは次のようになります。

\1\2'relu'\4 \n    # \1 = LeakyReLU\(alpha=a\)\(\1\)

スペースは、コード内で正しい書式を維持するためのものです。 :)

0
JTIM