2010-01-29 2 views
3

루비 분할 정규식과 함께 - 정규식은 내가 원하는 것을하고 있지 않다.

string = "<p>para1</p><p>para2</p><p>para3</p>" 

para2 텍스트를 나누고 싶습니다.

["<p>para1</p>", "<p>para3</p>"] 

때로는 para2가 p 태그로 래핑되지 않을 수도 있습니다. p 바깥 쪽과 안쪽의 선택적 공백). 이 작업을 수행 할 것이라고 생각 :

string.split(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/) 

하지만,이 얻을 :

["<p>para1</p>", "<p>", "</p>", "<p>para3</p>"] 

일치하는 패턴으로 시작 및 끝 p 태그를 당기는 - 그들은 일부로 제거해야합니다. 스플릿. 루비의 정규 표현식은 기본적으로 욕심이 많아서 그들이 끌어 들여질 것이라고 생각했습니다. 그리고 이것은 분할 대신에 gsub을 수행하면 확인 된 것 같습니다 :

string.gsub(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/, "XXX") 
=> "<p>para1</p>XXX<p>para3</p>" 

을 가져 와서 얻었습니다. 여기에서 없애 버리십시오. 누구 아이디어?

고맙습니다. 최대

+2

는 기억, 당신은 진정으로 정규 표현식으로 HTML을 구문 분석 할 수 없다. 이 문자열이 어떤 식 으로든 외부 입력에 종속되면 hpricot 또는 nokogiri와 같은 HTML 구문 분석기를 사용하십시오. – Matchu

답변

8

최대

덕분에, 비 캡처 그룹 (?:…)로 캡처 그룹 (…) 교체 :

/\s*(?:<p>)?\s*para2\s*(?:<\/p>)?\s*/ 
+1

이 답변은 정확합니다. 정규식을 사용하여 그룹을 캡처 할 때 캡처를 배열에 넣으므로보다 복잡한 검색/분할 작업을 수행 할 수 있습니다. – mckeed

+0

멋진 ... 우리가 Ruby에서 그걸 가지고 있다는 것을 몰랐습니다! – btelles

+0

감사합니다 검보, 그 트릭을 않습니다. 이전에 비 포획 그룹에 대해서 들어 본 적도 없었습니다. 정말 유용한 지식이었습니다. –