programing

두 태그 사이의 JavaScript regex 다중 행 텍스트

shortcode 2022. 10. 25. 21:12
반응형

두 태그 사이의 JavaScript regex 다중 행 텍스트

HTML에서 문자열을 가져오기 위해 regex를 작성했는데, 멀티라인 플래그가 작동하지 않는 것 같습니다.

이건 내 패턴이고 텍스트를 삽입하고 싶다.h1태그를 붙입니다.

var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

테스트하기 위해 끈을 만들었습니다.문자열에 "\n"이 포함되어 있으면 결과는 항상 null입니다."\n"을 모두 삭제하면 올바른 결과를 얻을 수 있습니다./m플래그를 설정합니다.

내 regex가 뭐가 문제죠?

찾고 있는 것은/.../sdotall 수식자라고도 합니다.그것은 점을 강요한다..새 줄과 일치하도록 설정되지만 기본적으로는 일치하지 않습니다.

나쁜 소식은 JavaScript에 존재하지 않는다는 입니다(ES2018 현재, 아래 참조).좋은 소식은 캐릭터 클래스(예:\s및 그 부정(\S)를 함께 사용하면 다음과 같이 됩니다.

[\s\S]

따라서 정규식은 다음과 같이 됩니다.

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

ES2018 현재 JavaScript는s(dotAll) 플래그, 그래서 현대 환경에서는 정규 표현이 당신이 쓴 그대로일 수 있지만,s(오히려) 마지막에 깃발을 세우다m;m변경 방법^그리고.$일하지 않다.):

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is

당신이 원하는 것은s(dotall) 수식자, Javascript에는 없는 것 같습니다.바꿀 수 있습니다..[\s\S]를 사용합니다.m(멀티라인) 수식자는 문자열 전체가 아닌 ^ 및 $ 일치 행을 만듭니다.

[\s\S]nodejs 6.11.3에서는 동작하지 않았습니다.RegExp 매뉴얼에 따르면[^]나한테는 효과가 있어

(점, 소수점)은 행 끝자를 제외한 임의의 단일 문자(\n, \r, \u2028 또는 \u2029)와 일치합니다.

문자 집합 내에서 점은 특별한 의미를 잃고 문자 그대로의 점과 일치합니다.

m m multiline 플래그는 도트 동작을 변경하지 않습니다.따라서 여러 줄에 걸쳐 패턴을 일치시키기 위해 문자 집합 [^]을 사용할 수 있습니다(물론 IE의 이전 버전을 의미하지 않는 경우 줄 바꿈을 포함한 모든 문자와 일치합니다).

예를 들어 다음과 같습니다.

/This is on line 1[^]*?This is on line 3/m

여기서 *?는 [^]의 0 이상 발생에 대한 비균형 붙잡기입니다.

dotall 수식자는 실제로 2018년 6월에 JavaScript, 즉 ECMAScript 2018에 추가되었습니다.
https://github.com/tc39/proposal-regexp-dotall-flag

const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`.
re.test('foo\nbar');
// → true
re.dotAll
// → true
re.flags
// → 's'

여러 줄의 스트링을 "\n"로 분할하고 원본 스트링의 분할을 연결하여 한 줄로 쉽게 조작할 수 있도록 하는 것이 좋습니다.

<textarea class="form-control" name="Body" rows="12" data-rule="required" 
                  title='@("Your feedback ".Label())'
                  placeholder='@("Your Feedback here!".Label())' data-val-required='@("Feedback is required".Label())'
                  pattern="^[0-9a-zA-Z ,;/?.\s_-]{3,600}$" data-val="true" required></textarea>


$( document ).ready( function() {
  var errorMessage = "Please match the requested format.";
  var firstVisit = false;

  $( this ).find( "textarea" ).on( "input change propertychange", function() {

    var pattern = $(this).attr( "pattern" );
    var element = $( this );

    if(typeof pattern !== typeof undefined && pattern !== false)
    {
      var ptr = pattern.replace(/^\^|\$$/g, '');
      var patternRegex = new RegExp('^' + pattern.replace(/^\^|\$$/g, '') + '$', 'gm');     

      var ks = "";
      $.each($( this ).val().split("\n"), function( index, value ){
        console.log(index + "-" + value);
        ks += " " + value;
      });      
      //console.log(ks);

      hasError = !ks.match( patternRegex );
      //debugger;

      if ( typeof this.setCustomValidity === "function") 
      {
        this.setCustomValidity( hasError ? errorMessage : "" );
      } 
      else 
      {
        $( this ).toggleClass( "invalid", !!hasError );
        $( this ).toggleClass( "valid", !hasError );

        if ( hasError ) 
        {
          $( this ).attr( "title", errorMessage );
        } 
        else
        {
          $( this ).removeAttr( "title" );
        }
      }
    }

  });
});

언급URL : https://stackoverflow.com/questions/1068280/javascript-regex-multiline-text-between-two-tags

반응형