[regex] 정규식은 전체 단어 만 일치

데이터베이스에 저장된 용어집에 포함 된 대소 문자를 구분하지 않고 주어진 콘텐츠 블록에서 모든 단어를 찾는 데 사용하는 정규식이 있습니다. 내 패턴은 다음과 같습니다.

/($word)/i

문제는 내가 사용 하면 일치하는 /(Foo)/i것과 같은 단어를 사용 Food한다는 것입니다. 단어 양쪽에 공백 또는 단어 경계가 있어야합니다.

Foo문장의 시작, 중간 또는 끝에 있는 단어 인 경우 에만 단어와 일치하도록 내 표현을 수정하려면 어떻게 해야합니까?



답변

단어 경계 사용 :

/\b($word)\b/i

또는 Sinan Ünür의 예에서와 같이 “SPECTRE”를 검색하는 경우 :

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


답변

전체 단어를 일치 시키려면 패턴을 사용합니다. (\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에는 하나 이상의 단어가 포함되어 있지만 $ 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.


답변

사용하면 \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
"SP에 대한 REx"\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ b "에 대한 sv에서 일치 시작을 추측합니다.
.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"


답변

단어 경계 사용 \ b,

다음 (4 개의 이스케이프 사용)이 내 환경에서 작동합니다. Mac, safari 버전 10.0.3 (12602.4.8)

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


답변

코드에서 Enum의 유효성을 검사하려는 사람들은 가이드를 따를 수 있습니다.

Regex World에서는 ^문자열을 시작하고 $종료 하는 데 사용할 수 있습니다 . 와 함께 사용 |하면 원하는 것이 될 수 있습니다.

^(Male)$|^(Female)$

Male또는 Female케이스에 대해서만 true를 반환합니다 .


답변

메모장에서 수행하는 경우 ++

[\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\)

공백은 내 코드에서 올바른 형식을 유지하는 것입니다. 🙂


답변

문자열의 모든 “단어”가져 오기

/([^\s]+)/g

기본적으로 ^/s공백에서 휴식 (또는 공백이 아닌 그룹과 일치)을 의미 합니다. Greedy를
잊지 마세요.g