我写了一个正则表达式从HTML获取字符串,但似乎多行标志不工作。
这是我的模式,我想在h1标签的文本。
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
我创建了一个字符串来测试它。当字符串包含“\n”时,结果始终为空。如果我去掉所有的“\n”,不管有没有/m标志,结果都是正确的。
我的正则表达式有什么问题?
我写了一个正则表达式从HTML获取字符串,但似乎多行标志不工作。
这是我的模式,我想在h1标签的文本。
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
我创建了一个字符串来测试它。当字符串包含“\n”时,结果始终为空。如果我去掉所有的“\n”,不管有没有/m标志,结果都是正确的。
我的正则表达式有什么问题?
当前回答
我的建议是,最好用“\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" );
}
}
}
});
});
其他回答
[\s\ s]在nodejs 6.11.3中不能正常工作。根据RegExp文档,它说要使用[^],这对我来说是有效的。
(点,小数点)匹配除行以外的任何单个字符 终止器:\n, \r, \u2028或\u2029。 在一个字符集中,点失去了它的特殊含义并进行匹配 字面意义上的点。 注意,m多行标志不会改变点行为。所以 在多行之间匹配一个模式,字符集[^]可以是 (当然,如果你不是指旧版本的IE),它会 匹配任何字符,包括换行符。
例如:
/这是在第一行[^]*?这是3号线/米
*在哪?是对0次或更多次[^]的非贪婪抓取。
您正在寻找/…/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中不存在——你可以替换。@molf建议使用[\s\ s]。 m(多行)修饰符使^和$匹配行,而不是整个字符串。
我的建议是,最好用“\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" );
}
}
}
});
});
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'