簡體   English   中英

JavaScript Regular Express點標記和全局標記

[英]JavaScript Regular Express both dotall and global flags

我有一個像這樣的字符串:

#a
b

#c
d

我想將其分解為以#開頭的部分:

#a
b

#c
d

我嘗試使用正則表達式進行嘗試,但是發現無法正常工作。

我雖然以下將工作:

var test='#a\nb\n#c\nd';
var re=/#.*?/gs;
var match=test.match(re);
alert(match.length);
alert(match);

也就是說, s修飾符通過換行符匹配, g修飾符拾取多個實例。 ? 懶惰的量詞應該阻止*走得太遠。

但是,我發現當我僅使用s ,它僅行至行尾。

顯然,有一些關於正則表達式或match()方法的問題。

順便說一句,我知道s只是JavaScript的最新功能,但是我正在Electron上工作,那里很容易獲得它。

正則表達式對於這項工作來說實在太多了。 使用內置的字符串函數。

 var str = `#a b #c d`; var chunks = str.split("\\n\\n"); console.log(chunks); 

編輯:如果唯一的目標是在以#開頭的行上拆分為多個部分,則可以使用

test.split(/^(?=#)/m)

參見JS演示:

 var test="#a\\nb\\n\\n#c\\nd"; console.log(test.split(/^(?=#)/m)) 

.*? 模式結尾處的字符永遠不會匹配任何字符,因為它會被跳過,並且模式結尾處表示匹配查找已完成。

采用

s.match(/#.*(?:\r?\n(?!\r?\n).*)*/g)

正則表達式演示

細節

  • # -一個#字符
  • .* -除換行符外的任何0+個字符
  • (?:\\r?\\n(?!\\r?\\n).*)* -0或多個重復
    • \\r?\\n(?!\\r?\\n) -可選的CR和LF,后面沒有可選的CR和LF
    • .* -除換行符外的任何0+個字符

或者, split /(?:\\r?\\n){2,}/與2個或更多換行符序列匹配使用split

JS演示:

 var test="#a\\nb\\n\\n#c\\nd"; console.log(test.match(/#.*(?:\\r?\\n(?!\\r?\\n).*)*/g)); console.log(test.split(/(?:\\r?\\n){2,}/)); 

我想我曾經忍受過一次熊的回答,但前提是您希望在換行符的基礎上打破, Wiktor Stribiewew的回答很好,但失敗了(至少在我看來)。

例如,如果我們在字符串上使用Wiktor的正則表達式/#.*(?:\\r?\\n(?!\\r?\\n).*)*/g

#Section 1
This is one section

And this is also part of first sections

#Section 2
This is part of section two.

然后它將忽略行“這也是第二部分的一部分”。 在其比賽中。 原因很簡單,因為他的正則表達式在double \\r?\\n的基礎上中斷,因此它只會忽略該行。

我假設您想要做類似Markdown的事情,在Markdown中,#用於自動檢測節和標題。

在這種情況下,請使用以下正則表達式: /#.*(?:\\r?\\n(?!#).*)*/g (?: /#.*(?:\\r?\\n(?!#).*)*/g .*)*/ /#.*(?:\\r?\\n(?!#).*)*/g ,這是對Wiktor很好回答的一個小修改。 這符合我們希望的行(我希望)。

它的作用是匹配整個部分,並進行負前瞻,因此它不包含下一部分以外的任何內容,即該行開頭的下一個#符號。

鏈接: https//regex101.com/r/ai15fP/2

暫無
暫無

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

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