我写了一个正则表达式从HTML获取字符串,但似乎多行标志不工作。
这是我的模式,我想获得h1标签中的文本。
h1
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi m = html.search(pattern); return m[1];
我创建了一个字符串来测试它。当字符串包含“\n”时,结果始终为空。如果我删除了所有的“\n”,它会给我正确的结果,不管有没有/m标志。
/m
我的正则表达式有什么问题?
s
.
m
你正在寻找/.../s修饰符,也称为dotall修饰符。它强制点.也匹配换行符,默认情况下是不做。
/.../s
坏消息是它JavaScript中不存在 (从ES2018开始,见下文)。好消息是,你可以通过一起使用字符类(例如\s)和它的反值(\S)来解决它,就像这样:
\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
const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`. re.test('foo\nbar'); // → true re.dotAll // → true re.flags // → 's'
在nodejs 6.11.3中[\s\S]不适合我。基于RegExp文档,它说使用[^],这对我来说是有效的。
[^]
(点,小数点)匹配除行以外的任何单个字符 终止符:\n, \r, \u2028或\u2029. 在字符集中,点失去了它的特殊含义并匹配 一个文字点。 注意,m多行标志不会改变点行为。所以 在多行之间匹配一个模式,字符集[^]可以是 (当然,如果你不是指旧版本的IE),它会 .匹配任何字符,包括换行
(点,小数点)匹配除行以外的任何单个字符 终止符:\n, \r, \u2028或\u2029.
在字符集中,点失去了它的特殊含义并匹配 一个文字点。
注意,m多行标志不会改变点行为。所以 在多行之间匹配一个模式,字符集[^]可以是 (当然,如果你不是指旧版本的IE),它会
例如:
/This is on line 1[^]*?This is on line 3/m
*在哪?是对0次或更多次[^]的非贪婪抓取。
我的建议是,最好用“\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" ); } } } }); });