JavaScript正则表达式多行标志不';行不通

JavaScript正则表达式多行标志不';行不通,javascript,regex,Javascript,Regex,我编写了一个正则表达式从HTML中提取字符串,但似乎多行标志不起作用 这是我的模式,我想在h1标记中获取文本 var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi m = html.search(pattern); return m[1]; var pattern=/.*([^您需要s(dotall)修饰符,这在Javascript中显然不存在-您可以按照@molf的建议将替换

我编写了一个正则表达式从HTML中提取字符串,但似乎多行标志不起作用

这是我的模式,我想在
h1
标记中获取文本

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

var pattern=/.*([^您需要
s
(dotall)修饰符,这在Javascript中显然不存在-您可以按照@molf的建议将
替换为[\s\s]。
m
(多行)修饰符使“^”和“$匹配行而不是整个字符串。

您正在查找
/…/s
修饰符,也称为点所有修饰符。它强制点
也匹配新行,默认情况下不会这样做

坏消息是它在JavaScript中不存在(从ES2018开始就存在,见下文)。好消息是,您可以通过同时使用字符类(例如
\s
)及其否定(
\s
)来解决它,如下所示:

[\s\S]
因此,在您的情况下,正则表达式将变成:

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

dotall修饰符实际上已于2018年6月将其转换为JavaScript,即ECMAScript 2018。


[\s\s]
在nodejs 6.11.3中对我不起作用。基于,它说使用对我起作用的
[^]

(点,小数点)匹配除行以外的任何单个字符 终止符:\n\r\u2028或\u2029

在一个字符集中,点失去了它的特殊意义和匹配 文字点

请注意,m多行标志不会更改点的行为 如果跨多行匹配一个模式,则可以使用字符集[^] 使用过(当然,如果你不是指旧版本的IE),它会 匹配任何字符,包括换行符

例如:

/这是第1行[^]*?这是第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" );
        }
      }
    }

  });
});

$(文档).ready(函数(){
var errorMessage=“请匹配请求的格式。”;
var firstVisit=false;
$(this).find(“textarea”).on(“输入更改属性更改”,函数(){
var模式=$(this.attr(“模式”);
var元素=$(此);
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”),函数(索引,值){
控制台日志(索引+“-”+值);
ks+=''+值;
});      
//控制台日志(ks);
hasError=!ks.match(patternRegex);
//调试器;
if(typeof this.setCustomValidity==“函数”)
{
此.setCustomValidity(hasError?errorMessage:);
} 
其他的
{
$(this).toggleClass(“无效”!!hasError);
$(this.toggleClass(“有效”!hasError);
if(hasrerror)
{
$(this.attr(“title”,errorMessage);
} 
其他的
{
$(此).removeAttr(“标题”);
}
}
}
});
});

您可以添加/s“修饰符设置单线模式,而不是多线模式。+1九年后,JavaScript现在有了
s
标志(ES2018)。:-)我可以使用:MDN:不要使用正则表达式来解析HTML,HTML不是一种常规语言。使用HTML解析器,而不是DOM。这也简单得多。你要找的是DOTALL,而不是多行。请注意,JavaScript是
DOTALL
修饰符,因此你可以做
/…/s
,你的点也会匹配新行。从2017年7月起,它是be在Chrome中找到一个标志。@Svante“不要使用正则表达式来解析HTML”:这不是解析。让我们不要为了找到一个标志而学习中文鱼'.你可以随意称呼它,但实际的问题似乎是“我如何在div box-content-6中找到h1标题?”而这个正则表达式(当它工作时)似乎更像是“给我div box-content-6的开始标记之后出现的最后一个h1标题”甚至在这方面也失败了,例如,当有匹配的部分被注释掉时。使用解析器,您只需解析,然后查询,这取决于语言,可能只是一个css选择器“。box-content-5 h1“。这更简单、更正确,显然如此。@simo匹配任何空白或非空白字符,有效地匹配任何字符。这就像
,但匹配空白(
\s
)意味着它匹配
\n
(在JavaScript中,
不起作用,或者可以使用
s
标志)
还可用于匹配JavaScript中的任何字符,包括换行符。有关性能问题,请参阅,强烈建议使用
*?
量词而不是
*
,以避免贪婪。这将避免捕获文档的最后一个字符:这可能不是您想要的,并且不如regexp有效将继续查找,直到字符串结束,即使它以前已经找到它。在regexp编译器上,[^]版本更容易,也更简洁。
[^]
仅适用于JavaScript(和其他ECMAScript实现),如果你尝试在其他方面使用它,可能会产生意想不到的结果。对于那些想知道
[^]
是什么意思的人来说:这就像一个双重否定:“匹配不在这个空列表中的任何字符”,所以它归结为“匹配任何字符”。
const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`.
re.test('foo\nbar');
// → true
re.dotAll
// → true
re.flags
// → 's'
<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" );
        }
      }
    }

  });
});