정규식:문자열의 두 태그 사이에 있는 하위 문자열을 꺼내려면

StackOverflow https://stackoverflow.com/questions/1237

  •  08-06-2019
  •  | 
  •  

문제

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

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

나는 그것을 잡고 싶다 Data I want 사이에서 [Start] 그리고 [End] Regex를 사용하는 태그.누구든지 이것이 어떻게 수행되는지 보여줄 수 있습니까?

도움이 되었습니까?

해결책

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

그러면 [start] 그리고 [end] 마커도.

다른 팁

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

Zhich는 캡처 내에서 텍스트를 중앙에 배치합니다.

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

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

일치하는 태그를 찾기 위해 정규식을 사용할 때의 함정에 대한 보다 완전한 논의는 다음에서 찾을 수 있습니다. http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi.특히 중첩 태그를 올바르게 해석하려면 본격적인 파서가 필요하다는 점에 유의하세요.

명시된 대로 질문에 답하려면 대소문자 구분을 꺼야 합니다.펄에서는 이것이다 수정자:

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

또 다른 비결은 *? 캡처된 일치 항목의 욕심을 끄는 수량자입니다.예를 들어, 일치하지 않는 항목이 있는 경우 [끝] 꼬리표:

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

아마도 다음을 캡처하고 싶지 않을 것입니다.

 Data i want [End] Data

정규식을 사용하여 여는 태그와 닫는 태그 사이의 데이터를 구문 분석할 수 있지만 이것이 가고 싶은 경로인지에 대해 오랫동안 열심히 생각해야 합니다.그 이유는 태그가 중첩될 가능성이 있기 때문입니다.중첩 태그가 발생할 수 있거나 발생할 수 있는 경우 해당 언어는 더 이상 정규적이지 않으며 정규식은 더 이상 구문 분석에 적합한 도구가 아닙니다.

PCRE 또는 Perl의 정규식과 같은 많은 정규식 구현은 이러한 대략적인 효과를 달성하는 데 사용할 수 있는 역추적을 지원합니다.그러나 PCRE(perl과 달리)는 무제한 역추적을 지원하지 않으며 이로 인해 실제로 태그가 너무 많으면 이상한 방식으로 문제가 발생할 수 있습니다.

이에 대해 더 자세히 논의하는 매우 일반적으로 인용되는 블로그 게시물이 있습니다. http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google에서 현재 캐시를 확인해 보니 가동 중지 시간이 있는 것 같습니다.)

글쎄요, 각 시작 태그 뒤에 종료 태그가 오는 것을 보장한다면 다음이 작동할 것입니다.

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

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

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

그러면 정규식에 문제가 발생합니다.

이제 다음 예에서는 페이지의 모든 핫 링크를 가져옵니다.

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

위의 경우 다음과 같은 중첩 사례가 발생하지 않음을 보장할 수 있습니다.

'<a></a>'

그러므로 이것은 복잡한 질문이고 단순한 대답만으로는 해결될 수 없습니다.

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
}

공백 문자와 점이 있는 태그 사이의 텍스트를 가져오려면 이 질문을 참조하세요(.)

[\S\s] 내가 사용한 거야

새 줄을 포함하여 모든 문자와 일치하는 정규식

대괄호 [], 즉 [Start] 및 [End] 안의 텍스트를 읽고 값 목록으로 배열의 유효성을 검사합니다. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top