두 태그 사이의 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가 뭐가 문제죠?
찾고 있는 것은/.../s
dotall 수식자라고도 합니다.그것은 점을 강요한다..
새 줄과 일치하도록 설정되지만 기본적으로는 일치하지 않습니다.
나쁜 소식은 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
'programing' 카테고리의 다른 글
java String.split()의 효과를 되돌리는 메서드? (0) | 2022.10.25 |
---|---|
SELECT 쿼리에서 계산된 필드를 재사용할 수 있습니까? (0) | 2022.10.25 |
VueJS 템플릿에서 동적 이름과 동적 구성 요소를 사용하여 슬롯 목록을 선언하려면 어떻게 해야 합니까? (0) | 2022.10.25 |
JavaScript에서 동적 변수 이름 사용 (0) | 2022.10.25 |
장고 "하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다." (0) | 2022.10.25 |