[英]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很好回答的一個小修改。 這符合我們希望的行(我希望)。
它的作用是匹配整個部分,並進行負前瞻,因此它不包含下一部分以外的任何內容,即該行開頭的下一個#符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.