regex - 한글 - 정규표현식 예제




정규식:문자열의 두 태그 사이에 하위 문자열을 가져 오려면 (6)

Perl을 사용하면 원하는 데이터를 ()로 둘러 쌀 수 있으며 나중에 다른 언어로도 비슷한 기능을 사용할 수 있습니다.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}

다음과 같은 형식의 파일이 있습니다.

Data Data
Data
[Start]
Data I want
[End]
Data

Regex를 사용하여 [Start][End] 태그 사이에서 Data I want 를 가져오고 Data I want . 누구든지 이것이 어떻게 이루어질 수 있는지 보여줄 수 있습니까?



음, 각 시작 태그 다음에 종료 태그가 오는 것을 보장하면 다음이 작동합니다.

\[start\](.*?)\[end\]

그러나 다음과 같은 복잡한 텍스트가있는 경우 :

[start] sometext [start] sometext2 [end] sometext [end]

정규 표현식에 문제가 생길 수 있습니다.

이제 다음 예는 페이지의 모든 핫 링크를 제거합니다.

'/<a(.*?)a>/i'

위의 경우에 중첩 된 경우가 없음을 보장 할 수 있습니다.

'<a></a>'

따라서 이것은 복잡한 질문이며 단순한 대답으로 해결 될 수는 없습니다.


일치하는 태그를 찾기 위해 정규식을 사용하는 것의 함정에 대한 자세한 설명은 http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi 에서 확인할 수 있습니다. 특히 중첩 태그는 올바르게 해석되기 위해서는 본격적인 파서가 필요하다는 점에 유의하십시오.

명시된대로 질문에 대답하려면 대소 문자를 구분해야합니다. 펄에서는 i가 수정 자입니다.

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

다른 트릭은 * 를 사용하는 것입니다 . 양화기는 캡처 된 일치의 탐욕을 끕니다. 예를 들어 일치하지 않는 [end] 태그가있는 경우 :

Data Data [Start] Data i want [End] Data [end]

당신은 아마 포획하고 싶지 않다 :

 Data i want [End] Data

$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

나는 잠시 동안 비슷한 문제가 있었고이 방법이 효과가 있다고 말할 수 있습니다 ...


\[start\](.*?)\[end\]

Zhich'll은 캡처 내에서 중간에 텍스트를 넣습니다.







parsing