HTML에서 문자열을 가져 오기 위해 정규식을 작성했지만 여러 줄 플래그가 작동하지 않는 것 같습니다.
이것은 내 패턴이며 텍스트를 h1
태그 로 가져 오려고합니다.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
테스트 할 문자열을 만들었습니다. 문자열에 “\ n”이 포함 된 경우 결과는 항상 null입니다. 모든 “\ n”을 제거하면 /m
플래그 유무에 관계없이 올바른 결과를 얻었습니다 .
내 정규식에 어떤 문제가 있습니까?
답변
dotall 수정 자라고/.../s
도 하는 수정자를 찾고 있습니다. 또한 점이 줄 바꿈과 일치하도록 강제 설정하지만 기본적으로 는 그렇지 않습니다 ..
나쁜 소식은 JavaScript에 존재 하지 않는다는 것입니다 (ES2018 기준으로 아래 참조) . 좋은 소식은 다음과 같이 문자 클래스 (예 \s
:)와 해당 부정 ( \S
)을 함께 사용하여 문제를 해결할 수 있다는 것입니다 .
[\s\S]
따라서 귀하의 경우 정규식은 다음과 같습니다.
/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i
ES2018로, 자바 스크립트가 지원 s
때문에 당신이 그것을 쓴 정규 표현식이 될 수있는 현대적인 환경에서, (DOTALL) 플래그를하지만과 s
끝 플래그 (이 아니라 m
, m
변화하는 방법 ^
과 $
작업,하지 .
) :
/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
답변
당신은 원하는 s
분명히 자바 스크립트에 존재하지 않는 (DOTALL) 수정을 – 당신은 대체 할 수 .
와 [\ S \ S] @molf에 의해 제안. m
(다중) 수정 차종 ^ 및 $ 일치하는 라인이 아닌 전체 문자열.
답변
[\s\S]
nodejs 6.11.3에서 작동하지 않았습니다. 에 기초 정규식 문서 , 그것은 사용하기 말합니다 [^]
나를 위해 작업을 수행한다.
(점, 소수점)은 줄 종결자를 제외한 모든 단일 문자 (\ n, \ r, \ u2028 또는 \ u2029)와 일치합니다.
문자 집합 내에서 점은 특별한 의미를 잃고 리터럴 점과 일치합니다.
m 멀티 라인 플래그는 도트 동작을 변경하지 않습니다. 따라서 여러 줄의 패턴을 일치시키기 위해 문자 집합 [^]을 사용할 수 있습니다 (물론 이전 버전의 IE를 의미하지 않는 경우), 개행을 포함한 모든 문자와 일치합니다.
예를 들면 다음과 같습니다.
/This is on line 1[^]*?This is on line 3/m
어디 *? [^]가 0 회 이상있는 욕심없는 잡입니다.
답변
dotall 수정자는 실제로 2018 년 6 월에 ECMAScript 2018 인 JavaScript로 만들었습니다.
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" );
}
}
}
});
});