Javascript正则表达式多行标志不起作用

时间:2009-07-01 09:52:35

标签: javascript regex

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

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

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

我创建了一个字符串来测试它。当字符串包含“\ n”时,结果始终为null。如果我删除所有“\ n”,它会给我正确的结果,无论是否有/ m标志。

我的正则表达式有什么问题?

5 个答案:

答案 0 :(得分:579)

您正在寻找/.../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

答案 1 :(得分:20)

你想要s(dotall)修饰符,这显然在Javascript中不存在 - 你可以用@molf建议用[\ s \ S]替换.m(多行)修饰符使^和$匹配行而不是整个字符串。

答案 2 :(得分:12)

[\s\S]在nodejs 6.11.3中对我不起作用。根据{{​​3}},它说使用[^]对我有用。

  

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

     

在字符集中,点失去其特殊含义并匹配   字面点。

     

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

例如:

/This is on line 1[^]*?This is on line 3/m

哪里有*?是0次或更多次[^]的非贪婪抓取。

答案 3 :(得分:7)

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'

答案 4 :(得分: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" );
        }
      }
    }

  });
});