정규식은 전체 단어 만 일치


92

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

/($word)/i

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

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

답변:


123

단어 경계 사용 :

/\b($word)\b/i

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

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

1
나는 당신이 게시했을 때이 답변의 긴 버전을 입력했습니다. :)
ZombieSheep

@RichardSimoes는 \b(<|>=)\b일치하지 않습니다>=
alhelal

@RichardSimoes와 \b[-|+][0-9]+\b경기 +10에서 43E+10. 둘 다 원하지 않습니다.
alhelal

추가되지 않거나 다른 단어에 포함되지 않은 단어를 검색하려면 어떻게해야합니까? 다음이 논리가 작동하지 않습니다
프라 사나 Sasne에게

누군가가 수학 비교 연산자> = 및 <=를 어떻게 얻을 수 있습니까?
AntonSack

51

전체 단어를 일치 시키려면 패턴을 사용합니다. (\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.


오전, 오후 말이 아니야?
minion

am과 pm을 단어로 지정하려면 (그렇지 않고 두문자어) 정규식 엔진의 단어 문자로 마침표를 추가합니다. 마침표를 단어 문자가 아닌 것으로 설정 한 것 같습니다. 따라서 정규식 단어는 일대일이 아니며 하이브리드 유럽어에 대한 유럽어 사전에서 배운 "단어"의 표준 정의에 적용됩니다. 언어 (또는 그 문제에 대한 다른 언어).
Eric Leschinski

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
"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"

1
일반적으로 단어는 \ w 단어이지만 흥미로운 점이라고 생각합니다.
Richard Simões

1

단어 경계 사용 \ b,

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

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

1

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

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

^(Male)$|^(Female)$

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


^$의 시작 (각각 끝) 과 일치하므로 해당 행의 유일한 단어 인 경우 에만 예제가 일치 합니다 .
gented

그리고 이것은 열거 형의 유효성을 검사하고 싶을 때 정확히 원하는 것입니다! 무엇이 문제입니까?
MohamadrezaRahimianGolkhandani

0

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

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

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


-1

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

/([^\s]+)/g

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.