質問
私はデータベースに格納されている用語集に含まれているコンテンツを、大文字小文字を区別しないの与えられたブロック内のすべての単語を見つけるために使用している正規表現式を持っています。ここに私のパターンがあります:
/($word)/i
問題は、私は/(Foo)/i
を使用している場合、その後Food
のような言葉が一致します、です。単語の両側に空白文字または単語境界が存在する必要がある。
どのように私はそれが冒頭に単語、中、または文の終わりである場合にのみ単語Foo
に一致するように、私の表現を変更することができますか?
解決
使用単語の境界ます:
/\b($word)\b/i
それとも、「S.P.E.C.T.R.E.」を探している場合シナンÜnürの例のように:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
他のヒント
あなたはパターン(\w+)
を使用する任意の単語全体を一致させるには、
あなたはPCREまたは類似のものを使用していると仮定します:
このライブの例から取ったスクリーンショットの上: http://regex101.com/r/cU5lC2する
(\w+)
でコマンドライン上の任意の単語全体の一致
//リリース:私は<のhref = "HTTP上で phpsh対話型シェルを使用してなります。 PCRE正規表現エンジンrel="noreferrer">の Ubuntuの12.10 のとして知られている方法を介して、するpreg_match の
言葉に、変数に一致するものをいくつかのコンテンツを入れて、phpshを開始します。
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
$content1
パターンと$content2
、$content3
と(\w)+
:するpreg_match方法は、変数を分析するためにPHP言語内PCREエンジンを使用します。
$ content1と$ content2は、少なくとも一つの単語、$の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は、文字列ダーツやおならが含まれています。 gun4はしていません。しかし、ワードfart
を探していることはfarty
に一致する問題がある可能性があります。この問題を解決するには、正規表現で単語の境界を強制します。
マッチリテラルの言葉。
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
それはfart
ワード境界でワード\b
は、コンテンツ内に存在しないことを除き、前の例と同じですので:farty
を。
\b
を使用すると、驚くべき結果を得ることができます。あなたは、その定義から単語を分離するものを考え出すとあなたのパターンにその情報を取り入れたほうが良いでしょう。
#!/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";
}
出力:
Compiling REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" Final program: 1: BOUND (2) 2: OPEN1 (4) 4: EXACT (9) 9: CLOSE1 (11) 11: BOUND (12) 12: END (0) anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14 Guessing start of match in sv for REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P .E.C.T.R.E. (Special Executive for Counter-intelligence,"... Found anchored substr "S.P.E.C.T.R.E." at offset 0... start_shift: 0 check_at: 0 s: 0 endpos: 1 Does not contradict STCLASS... Guessed: match at offset 0 Matching REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P.E.C.T.R.E. (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 Freeing REx: "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
B \単語の境界を使用し、
(4つのエスケープを使用して)、次の私の環境で動作します:マック、サファリバージョン10.0.3(12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
メモ帳でそれをやっている場合は++
[\w]+
あなたに単語全体を与えるだろう、とあなたはグループとしてそれを得るために、括弧を追加することができます。例:conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
。私はコメントとして、独自のラインにLeakyReLU
を移動し、現在の活性化を交換したいと思います。メモ帳で++これは見つける続くコマンドを使用して行うことができます:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
と交換するコマンドは次のようになります。
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
スペースは私のコードでは、右の書式設定を維持することです。 :)