簡體   English   中英

正則表達式:將字符串與具有相同模式的子字符串匹配

[英]Regex: Match string with substrings with the same pattern

我正在嘗試將字符串與模式匹配,該模式可以具有相同模式的子字符串。

這是一個示例字符串:

尼加拉瓜[[注釋|注釋|剛果自1999年起成為ICCROM成員,1971年成為尼加拉瓜成員。2013年11月,ICCROM大會暫停了這兩項成員,連續六年沒有繳納會費(ICCROM [[章程| | | url] | www.iccrom.org/about/statutes/]],第9條。]]。 可能出現的另一個[[link | url | google.com]]。

這是模式:

[[display_text|code|type|content]]

所以,我想要的是在括號內獲取字符串,然后查找更多與頂級模式匹配的字符串。

而我想要的是匹配這個:

  1. [[注| s |注釋|剛果自1999年起成為ICCROM成員,1971年成為尼加拉瓜成員。2013年11月,ICCROM大會暫停了這兩項成員,但連續六年沒有繳納會費(ICCROM [[章程| |] url | www.iccrom.org/about/statutes/]],第9條。)]

1.1 [[章程| s | url | www.iccrom.org/about/statutes/]]

  1. [鏈接| S |網址| google.com]

我正在使用這個/( /(\\[\\[.*]])/ ]]]]]]但它直到最后才獲得所有]]

我想要的是能夠識別匹配的字符串並將它們轉換為HTML元素,其中|note| 將成為一個blockquote標簽和|url| a標簽。 因此,blockquote標記內部可以包含鏈接標記。

順便說一下,我正在使用CoffeeScript來做到這一點。

提前致謝。

通常,正則表達式不擅長處理嵌套表達式。 如果你使用貪婪的模式,它們會匹配太多,如果你使用非貪婪的模式,正如@bjfletcher建議的那樣,它們匹配得太少,停在外部內容中。 這里的“傳統”方法是一個基於令牌的解析器,您可以逐個遍歷字符並構建一個抽象語法樹(AST),然后根據需要重新格式化。

我在這里使用的一種略微hacky方法是將字符串轉換為JSON字符串,讓JSON解析器完成轉換為嵌套對象的艱苦工作: http//jsfiddle.net/t09q783d/1/

function toPoorMansAST(s) {
    // escape double-quotes, as they'll cause problems otherwise. This converts them
    // to unicode, which is safe for JSON parsing.
    s = s.replace(/"/g, "\u0022");
    // Transform to a JSON string!
    s =
        // Wrap in array delimiters
        ('["' + s + '"]')
        // replace token starts
        .replace(/\[\[([^\|]+)\|([^\|]+)\|([^\|]+)\|/g,
             '",{"display_text":"$1","code":"$2","type":"$3","content":["')
        // replace token ends
        .replace(/\]\]/g, '"]},"');

    return JSON.parse(s);
}

這將為您提供一個字符串和結構化對象的數組,然后您可以通過格式化程序來運行您想要的HTML。 格式化程序留給用戶:)。

暫無
暫無

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

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