簡體   English   中英

兩個標簽之間的 JavaScript 正則表達式多行文本

[英]JavaScript regex multiline text between two tags

我寫了一個正則表達式來從 HTML 中獲取字符串,但似乎多行標志不起作用。

這是我的模式,我想在h1標簽中獲取文本。

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

我創建了一個字符串來測試它。 當字符串包含“\\n”時,結果始終為空。 如果我刪除了所有的“\\n”,無論有沒有/m標志,它都會給我正確的結果。

我的正則表達式有什么問題?

您正在尋找/.../s修飾符,也稱為dotall修飾符。 它強制點. 還匹配換行符,默認情況下它不會這樣做

壞消息是它在 JavaScript 中不存在(從 ES2018 開始,見下文) 好消息是您可以通過同時使用字符類(例如\\s )及其否定( \\S )來解決它,如下所示:

[\s\S]

因此,在您的情況下,正則表達式將變為:

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

從 ES2018 開始,JavaScript 支持s (dotAll) 標志,因此在現代環境中,您的正則表達式可能與您編寫的一樣,但末尾帶有s標志(而不是mm改變了^$工作方式,而不是. ):

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

您需要s (dotall) 修飾符,它顯然在 Javascript 中不存在 - 您可以替換. 使用@molf 建議的 [\\s\\S]。 m (多行)修飾符使 ^ 和 $ 匹配行而不是整個字符串。

[\\s\\S]在 nodejs 6.11.3 中對我不起作用。 根據RegExp 文檔,它說使用[^]對我有用。

(點,小數點)匹配除行終止符之外的任何單個字符:\\n、\\r、\
 或 \
。

在字符集中,點失去了它的特殊意義並匹配了一個文字點。

請注意, m 多行標志不會改變點行為。 因此,要匹配多行模式,可以使用字符集 [^](當然,如果您不是指舊版本的 IE),它將匹配任何字符,包括換行符。

例如:

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

*在哪里? 是 0 次或多次出現 [^] 的非貪婪抓取。

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'

我的建議是,最好用“\\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" );
        }
      }
    }

  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM