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


90

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

/($word)/i

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

Foo文の最初、途中、または最後の単語である単語のみに一致するように式を変更するにはどうすればよいですか?

回答:


120

単語の境界を使用する:

/\b($word)\b/i

または、SinanÜnürの例のように「SPECTRE」を検索している場合:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i

1
あなたが投稿したとき、私はちょうどこの答えの長いバージョンをタイプしていました。:)
ZombieSheep 2009年

@RichardSimoesは\b(<|>=)\b一致していません>=
alhelal

@RichardSimoesと\b[-|+][0-9]+\b一致+1043E+10ます。どちらも欲しくない。
alhelal 2018年

追加されていない、または他の単語に含まれていない単語を検索したい場合はどうなりますか。その後、このロジックは機能しません
Prasanna Sasne 2018年

誰かが数学的な比較演算子> =と<=をどのように取得しますか?
AntonSack

50

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

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

ここに画像の説明を入力してください

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

コマンドラインの単語全体を (\w+)

私が使用していますphpsh対話型シェルのUbuntu 12.10を実証するPCREの正規表現エンジンをとして知られている、方法をする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

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

$ content1と$ content2には少なくとも1つの単語が含まれていますが、$ 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はしません。ただし、単語の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


午前、午後は言葉ではありませんか?
ミニオン2018年

amとpmを強制的に単語にしたい場合は(そうではなく、頭字語です)、正規表現エンジンの単語文字としてピリオドを追加します。あなたにとって、ピリオドを単語文字ではなく設定したように見えるので、正規表現の単語は、ハイブリッドヨーロッパのヨーロッパ辞書で教えられた「単語」の標準的な定義に対して1対1ではありません言語(またはその他の言語)。
EricLeschinski18年

8

使用\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";
}

出力:

RExのコンパイル "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"
最終プログラム:
   1:バウンド(2)
   2:OPEN1(4)
   4:正確(9)
   9:CLOSE1(11)
  11:バウンド(12)
  12:終了(0)
0に固定された「SPECTRE」(固定されていることを確認)stclass BOUND minlen 14
REx "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"のsvでの "SPに対する一致の開始を推測します
.ECTRE(防諜のための特別幹部」...
オフセット0でアンカーされたsubstr "SPECTRE"が見つかりました。
start_shift:0 check_at:0 s:0 endpos:1
STCLASSと矛盾しません...
推測:オフセット0で一致
REx "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"を "SPECTRE(Special Exec
防諜に役立つ」...
   0 | 1:バウンド(2)
   0 | 2:OPEN1(4)
   0 | 4:正確(9)
  14 | 9:CLOSE1(11)
  14 | 11:BOUND(12)
                                  失敗しました...
一致しませんでした
レックスの解放: "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"

1
単語は通常\ w単語になると思いますが、興味深い点です。
リチャードSimões

1

単語の境界を使用\ b、

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

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)

1

コード内の列挙型を検証したい人のために、ガイドに従うことができます

正規表現の世界では^、文字列の開始と$終了に使用できます。それらを組み合わせて使用​​する|ことはあなたが望むものかもしれません:

^(Male)$|^(Female)$

MaleまたはのFemale場合にのみtrueを返します。


^$の先頭(それぞれ末尾)に一致するため、例は、それらが行の唯一の単語である場合にのみ一致します。
gented

これは、列挙型を検証したいときにまさに必要なものです。何が問題ですか?
MohamadrezaRahimianGolkhandani

0

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

[\w]+ 

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

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

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

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

スペースは、コード内で正しいフォーマットを維持するためのものです。:)


-1

文字列内のすべての「単語」を取得します

/([^\s]+)/g

基本的に^/sはスペースを壊すことを意味します(または非スペースのグループに一致します)貪欲
gために忘れないでください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.