2017-02-22 1 views
0

다른 정규 표현식이 붙어 있습니다. 전자 메일 데이터를 추출 중입니다. 아래의 예제에서는 따옴표 안에 시간, 날짜 및 메시지 만 변경됩니다.Regex - 전체 날짜 이후 및 표준 텍스트 앞의 문자열 얻기

Message Received 6:06pm 21st February "Hello. My name is John Smith" Some standard text. 
Message Received 8:08pm 22nd February "Hello. My name is "John Smith"" Some standard text. 

어떻게 내가 데이터의 특정 지점에서 검색을 시작하는 긍정적 인 lookbehind, (?<=Message Received) 시작해야하는 경우에만 메시지를받을 수 있나요? 메시지는 항상 따옴표로 시작하고 끝나지만 사용자는 두 번째 예와 같이 자신의 따옴표를 삽입 할 수 있습니다.

+0

큰 따옴표로 쓰여진 데이터를 추출 하시겠습니까? –

답변

0

그냥 캡처 그룹에 부정의 charcter 클래스를 사용할 수 있습니다 :

/Message Received.*?"([^\n]+)"/ 

발췌문 :

$input = 'Message Received 6:06pm 21st February "Hello. My name is John Smith" Some standard text. 
Message Received 8:08pm 22nd February "Hello. My name is "John Smith"" Some standard text.}'; 

preg_match_all('/Message Received.*?"([^\n]+)"/', $input, $matches); 

foreach ($matches[1] as $match) { 
    echo $match . "\r\n"; 
} 

출력 :이 페이지에 다른 세 게시 된 답변 중

> Hello. My name is John Smith 
> Hello. My name is "John Smith" 
0

큰 따옴표 사이에 메시지를 추출하는 데 사용됩니다.

(?=Message Received)[^\"]+\K\"[\w\s\"\.]+\"

Regex demo

0

당신은 그룹에 메시지를 캡처

(?<=Message Received)[^"]*(.*)(?=\s+Some standard text) 
0

두가 잘못된 결과를 제공합니다. (132 개) 조치를 취하고,

/Message Received[^"]+"\K[^\n]+(?=")/ (없음 캡처 그룹 :

올바르게 다음 패턴 중 하나를, 외부 따옴표 사이의 문자열을 추출 사용하려면 : 다른 아무도 그들이 할 수 있기 때문에 답변으로 효율적 게시되지 Demo)

/Message Received[^"]+"([^\n]+)"/ (캡처 그룹은 130 단계, Demo)

이 두 패턴이 부정 문자 클래스에 이르는 및 대상 문자열을 포함를 사용하여 최대의 정확성과 효율성을 제공됩니다. 첫 번째 패턴은 캡처 그룹 대신 \K을 사용하여 preg_match_all()의 출력 배열을 50 % 가량 줄입니다. 이러한 이유로 이러한 패턴 중 하나를 프로젝트에 사용해야합니다. 입력 문자열의 크기가 커질수록 내 패턴은 다른 게시 된 패턴에 비해 성능이 향상됩니다.

PHP 구현 :

$in이 입력 문자열을 나타냅니다.

패턴 # 1 방법 :

var_export(preg_match_all('/Message Received[^"]+"\K[^\n]+(?=")/',$in,$out)?$out[0]:[]); 
// notice the output array only has elements in the fullstring subarray [0] 

출력 :

array (
    0 => 'Hello. My name is John Smith', 
    1 => 'Hello. My name is "John Smith"', 
) 

패턴 # 2 방법 :

var_export(preg_match_all('/Message Received[^"]+"([^\n]+)"/',$in,$out)?$out[1]:[]); 
// notice because a capture group is used, [0] subarray is ignored, [1] is used 

출력 :

array (
    0 => 'Hello. My name is John Smith', 
    1 => 'Hello. My name is "John Smith"', 
) 
,

두 가지 방법 모두 원하는 출력을 제공합니다.


Anirudha의 잘못된 패턴 : /(?<=Message Received)[^"]*(.*)(?=\s+Some standard text)/ (345 단계 + 캡처 그룹 +가 원하지 않는 외부 따옴표 포함)

조쉬 Crozier가의 패턴 : /Message Received.*?"([^\n]+)"/ (174 단계 + 캡처 그룹)

Sahil Gulati의 이 올바르지 않음 패턴 : /(?=Message Received)[^\"]+\K\"[\w\s\"\.]+\"/ (109 단계 + 원치 않는 외부 큰 따옴표 포함 + 패턴에서 문자를 불필요하게 이스케이프 처리 함)

관련 문제