112

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

/($word)/i

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

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

4

7 に答える 7

156

単語の境界を使用する:

/\b($word)\b/i

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

/(?:\W|^)(\Q$word\E)(?:\W|$)/i
于 2009-11-17T19:51:14.593 に答える
67

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

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

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

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

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

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

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

于 2014-01-06T17:51:24.340 に答える
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:閉じる1(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:BOUND(2)
   0 | 2:OPEN1(4)
   0 | 4:正確(9)
  14 | 9:CLOSE1(11)
  14 | 11:BOUND(12)
                                  失敗した...
一致しませんでした
RExを解放する: "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"
于 2009-11-17T20:03:41.263 に答える
2

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

[\w]+ 

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

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

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

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

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

于 2019-06-11T10:55:14.790 に答える
2

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

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

^(Male)$|^(Female)$

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

于 2020-08-05T10:20:42.173 に答える
1

単語の境界を使用\b、

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

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
于 2018-06-07T18:11:56.463 に答える
-1

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

/([^\s]+)/g

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

于 2020-03-17T21:14:21.903 に答える