단어 또는 접두사와 일치하는 정규식


119

전체 단어에 대해 정규식을 일치시키고 싶습니다.

다음 예에서 나는 일치하는 것을 시도하고있다 s또는 season그러나 나는 성냥을 가지고있는 s, e, a, on.

[s|season]

전체 단어와 일치하는 정규식을 어떻게 만듭니 까?


4
(season|s)대신 사용하십시오 . [season]의 일치 s, e, a, o, n.
falsetru

답변:


137

대괄호는 문자 클래스에 대한 의미하며, 실제로 중 하나를 일치하려는 : s, |, s(다시), e, a, s(다시), on.

그룹화에 대신 괄호를 사용하십시오.

(s|season)

또는 비 캡처 그룹 :

(?:s|season)

참고 : 캡처되지 않은 그룹은 일치 항목을 저장할 필요가 없다고 엔진에 알리고 다른 그룹 (캡처 그룹은 수행함)을 저장합니다. 작은 물건의 경우, '무거운 의무'물건의 경우 일치가 필요한지 여부를 먼저 확인하고 싶을 수 있습니다. 그렇지 않은 경우 사용할 필요가없는 항목을 저장하는 대신 비 캡처 그룹을 사용하여 계산에 더 많은 메모리를 할당하는 것이 좋습니다.


그래 나는 그것을 깨달았다. 비 포착은 내가 필요로하는 것이었다. ()를 사용하면 항상 일치한다고 생각했는데 일치하지 않는 옵션이 있다는 것을 알면 편리합니다. 감사합니다.
NMGod aug

당신은 그것을 이해하지 못했습니다. ?:내부 일명 그룹화 non-capturing당신이 일치하는 표현식에 사용할 수 없다는 것을 말한다 $1, $2및 등등 ... 당신이 표현이 일치하지 않는 것을, 당신이 필요가합니다 ^.
EverythingRightPlace

@ NMGodA1b2c3d4 천만에요! 일치하지 않거나 잡을 수없는 옵션을 의미합니까 (예, 차이가 있습니다). 이들 중 어느 것도 일치하지 않으려면 (?! ... )insead를 사용 (?!s|season)합니다.이 경우에는 의미 합니다.
Jerry

126

이 라이브 온라인 예제를 사용하여 패턴을 테스트하십시오.

여기에 이미지 설명 입력

이 라이브 예제에서 가져온 위의 스크린 샷 : https://regex101.com/r/cU5lC2/1

명령 줄의 모든 단어와 일치합니다.

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에는 포함되지 않습니다.

단어 현상금없이 명령 줄의 특정 단어와 일치

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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

변수 gun1gun2문자열을 포함 dart하거나 fart맞지만 gun3에 포함되어 darty있고 여전히 일치하는 것이 문제입니다. 다음 예제로 넘어갑니다.

명령 줄의 특정 단어를 단어 경계와 일치 :

단어 경계는와 강제 일치시킬 수 있습니다 \b. 다음을 참조하십시오. jex.im/regulex에서 wordboundary가 수행하는 작업에 대한 시각적 분석

http://jex.im/regulexhttps://github.com/JexCheng/regulex 에서 얻은 Regex Visual Image 예 :

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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

\b우리가 반드시 "다트"를 만들고, 단어 경계가 일치하지만, "DARTY"가 아니라고 주장한다.


3
내가 \ b 문자가 필요했기 때문에 upvoted, 그리고 그것을 몰랐습니다!
Nieminen

이 철저한 설명이 답이 아닌 이유는 무엇입니까?
dewwwald

1
질문을 게시 한 사람이 첫 번째 답변을 선택하고 나중에 내 매우 우수한 답변이 들어 왔을 때 내 답변으로 전환하지 않았기 때문입니다. 질문 아래의 댓글을 통해 질문자에게 답변 선택을이 질문으로 변경하도록 요청할 수 있으며,이 페이지를 방문하는 사람들에게이 페이지의 가치를 향상시킬 수 있습니다.
Eric

1
예에서 "방귀"라는 단어를 사용했기 때문에 찬성했습니다. 그리고 \ w +가 필요했습니다.)
SomethingOn


4

js에서 예제를 테스트합니다. 가장 간단한 해결책-/ / 안에 필요한 단어를 추가하십시오.

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

이제 다른 기호 문자가 아닌 경계가있는이 특정 단어가 필요하면. b 마커를 사용 합니다.

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

객체 결과를 반환하는 js에는 exec () 메서드도 있습니다. fg가 우리 단어의 장소 / 색인에 대한 정보를 얻는 데 도움이됩니다.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

문자열 / 문장 / 텍스트에서 일치하는 모든 단어를 가져와야하는 경우 g 수정 자 (전역 일치)를 사용할 수 있습니다.

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

이제 마지막 하나-특정 단어 하나가 필요하지 않지만 일부는 필요합니다. 우리는 사용 | 기호는 선택 / 또는을 의미합니다.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

2

[ ]문자 클래스를 정의합니다. 그래서 거기에 설정 한 모든 캐릭터가 일치합니다. [012]일치 0하거나 1또는 2[0-2]동일하게 동작합니다.

원하는 것은 or- 문을 정의하기위한 그룹화입니다. (s|season)문제에 사용하십시오 .

Btw. 조심해야합니다. 일반 정규식 (또는 그룹 내부)의 메타 문자는 문자 클래스와 다릅니다. 문자 클래스는 하위 언어와 같습니다. 또는 [$A]만 일치 합니다. 달러를 위해 여기서 탈출하지 마십시오.$A

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