データベースに格納されている用語集に含まれている、大文字と小文字を区別しないコンテンツの特定のブロック内のすべての単語を見つけるために使用している正規表現を持っています。これが私のパターンです:
/($Word)/i
問題は、/(Foo)/i
を使用すると、Food
などの単語が一致することです。 Wordの両側に空白またはWord境界が必要です。
文の先頭、中間、または末尾の単語である場合に、単語Foo
のみに一致するように式を変更するにはどうすればよいですか?
単語の境界を使用:
/\b($Word)\b/i
または、「S.P.E.C.T.R.E。」を検索している場合SinanÜnürの例のように:
/(?:\W|^)(\Q$Word\E)(?:\W|$)/i
(\w+)
というパターンを使用しますPCREまたは類似のものを使用していると仮定します。
この実例から取られた上記のスクリーンショット: http://regex101.com/r/cU5lC2
(\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
に存在しないことを除いて、前の例と同じです。
\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 "
単語の境界を使用する\ b、
次の(4つのエスケープを使用)は私の環境で動作します:Mac、safariバージョン10.0.3(12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
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\)
スペースは、コード内で正しい書式を維持するためのものです。 :)