2014-06-12 6 views
6

나는 stackoverflow와 Regexes에 새로운 것이므로 실수를 용서해주십시오.Regex가 {} 사이에없는 모든 것을 검색하고 일치하는 것을 검색 할 때

저는 대괄호 {} 사이에없는 모든 텍스트와 일치하는 텍스트를 찾기 위해 철저히 검색했으며 텍스트에서 특정 단어를 찾습니다. 다음 문자열에서 예를 들어 :

$content = 'Hello world, { this } is a string with { curly brackets } and this is for testing'

나는 this의 두 번째 발생을 반환하는 단어 this에 대한 검색을하고자 그 때문에 중괄호 안에없는 지역이다. 중괄호 밖의 부분 문자열과 일치하는 Regex를 얻을 수 있다고해도 상황이 단순 해집니다. 이 Regex /(}([^}]*){)/을 찾았지만, Hello world,and this is for testing}{ 안에 있지 않고 단지 is a string with 부분 만 선택하기 때문에 부품을 선택할 수 없습니다.

또한 내가 두 가지 정규식을 단일 목적으로 결합 할 수 있는지 물어보고 싶습니다. 예를 들어 첫 번째 Regex는 {} 외부의 문자열을 찾고 두 번째는 검색 할 특정 단어를 찾습니다.

나는이 정규 표현식을 PHP에서 사용하고 싶다. 현재는 해킹과 같은 기능을 사용하고있다. 목적은 {}에없는 특정 단어를 찾아 안정적으로 바꾸고 텍스트 파일에 쓰는 것입니다.

미리 도움을 주셔서 감사합니다. PHP의 PCRE 정규식 엔진이 작업의 이런 종류의 훌륭한있는 구문으로

답변

5

(* SKIP) (* F)

당신은 운입니다.

{[^{}]*}(*SKIP)(*F)|\bthis\b 

이 좋아,하지만 어떻게 작동합니까 : 마법처럼이 깔끔한 정규식 작업 (demo 참조)?

당신이 물어 주어서 기쁩니다. |의 왼쪽 부분은 {braces}과 완전히 일치하고 의도적으로 실패합니다. 그 후 엔진은 문자열의 다음 위치로 건너 뜁니다.

방법

PHP에서 사용하기 ... 오른쪽은 당신이 원하는 this 단어와 일치, 우리는 그들이 왼쪽의 표현식과 일치하지 않았기 때문에 그들이 올바른 사람을 거 알아 같은 그냥 보통 뭔가 :

$regex = "~{[^{}]*}(*SKIP)(*F)|\bthis\b~"; 
$count = preg_match_all($regex,$string,$matches); 

당신은 또한이 유사한 전자에 대한 책을 읽은 $matches[0]

좀보고 싶을 것이다 xclusion 기술

이 상황은 당신이 관심과 (*SKIP) 전력을 즐길 경우, 당신은 완전히 기술을 이해하는 읽기 및이 방법을 확장 할 수 있습니다 것 같아서,이 질문에 대한 "regex-matching a pattern unless...", 매우 유사하다.문자열

+0

완벽하게 작동합니다. 나는 (* SKIP) (* F)과 같은 것이 있어야한다는 것을 알았지 만 나는 그것을 모르고 있었다. 이상하게도 stackoverflow에 관한 비슷한 질문이 아직 없습니다. 적어도 나는 하나를 찾을 수 없었다. 감사합니다 – Shark

+0

@Shark 고마워, 다행 니가 좋아! :) 안녕하세요 btw, 나는 아직 StackOverflow에 투표하지 않은 것을 알 수 있습니다. 도움이되는 답변을 찾으려면 평판 시스템이 작동하는 방식이므로 투표를 고려하십시오. 물론, 의무는 없습니다! 제 10 초 SO 대표 자습서를 듣고 주셔서 감사합니다. :) – zx81

+1

@Shark Btw이 기술로 다른 SO 질문을 찾을 수 있지만, Google의 상단에는 맞지 않을 수 있습니다. 전체 기사를 보려면 [링크 된 질문] (http://stackoverflow.com/questions/23589174/match-or-replace-a-pattern-except-in-situations-s1-s2-s3)을 살펴 보는 것이 좋습니다. -etc/23589204 # 23589204), 나중에 저장해두면 답을 쓰는 데 많은 재미가있었습니다. :) – zx81

0

매우 긴하지, 나는 ... 다음 strtr이 검색

$content = 'Hello world, { this } is a string with { curly brackets } and this is for testing'; 

function searchify($stack,$charStart='{',$charEnd='}') { 
    $searchArea = ''; 
    $first = explode($charStart,$stack); 
    foreach ($first as $string) { 
    list($void,$ok) = (strpos($string,$charEnd) ? explode($charEnd,$string) : array('',$string)); 
    $searchArea.= $ok; 
    } 
    return $searchArea; 
} 

이 지워진 문자열을 반환 할

$replacing = array 
('with'=>'this', 
    "\n"=>'<br>', 
    ' '=>"<br>",); 
$raw = searchify($content); 
$replaced = strtr($raw,$replacing); 
var_dump($replaced); 

를 단순한 문자열 조작 함수를 사용하는 거라고 ... 그 안에있는 값을 바꿉니다.

+0

나는 오늘 당신의 대답을 나중에 시도 할 것입니다. 나는 더 빨리, Regex Preg_replace(), 또는 str_replace 함수를 궁금해? 이 질문에서 언급했듯이, 나의 목적은 긴 문자열에서 그러한 모든 일치를 대체하는 것이다. 그리고 단어 나누기에 \ bword \ b를 사용하고 preg_replace에 넣는 정규식은 한 줄의 솔루션으로도 완벽하게 보입니다. – Shark

+0

이것은 쉽게 구현 될 수 있지만 가장 빠른 것은 정규식이 될 것이라고 저는 생각합니다. 당신의 끈은 얼마나 오래 되었습니까? –

+0

문자열의 길이가 내 질문과 같거나 그 이상입니다. – Shark

관련 문제