簡體   English   中英

正則表達式解析格式器字符串

[英]Regex to parse formatter string

我正在寫一個string.Format類的方法。 為此,我采用正則表達式來確定命令和參數:例如Format(@"\\m{0,1,2}", byteArr0, byteArr1, byteArr2)

對於第一個正則表達式,返回2組:

  • '\\m'
  • '{0,1,2}'

另一個正則表達式取值'{0,1,2}'並具有3個匹配項:

  • 0
  • 1
  • 2

這些值是對應於byteArr參數的索引。

這個命令結構可能會增長,所以我真的想弄清楚這一點並學到足夠的知識,以便能夠修改Regex以滿足將來的需求。我認為單個Regex可以滿足上述所有要求,但是擁有價值2個獨立的 Regex(es / ices ???) 表達式。

無論如何,要獲取第一個組'\\m'則表達式是:

"(\\)(\w{1,1})"  // I want the '{0,1,2}' group also 

為了獲得整數匹配'{0,1,2}'我正在嘗試:

"(?<=\{)([^}]*)(?=\})"

我很難實現: (1)第一個表達式中有2個組,而(2)在第二個表達式中由逗號分隔的大括號內的整數上有3個匹配。

您的第一個正則表達式(\\\\)(\\w{1,1})可以大大簡化。

  • 您不想將\\單獨捕獲到m因此無需將它們包裝在自己的括號中。
  • \\w{1,1}\\w相同。

因此我們有\\\\\\w匹配第一部分\\m

現在處理第二部分,實際上我們可以忽略示例中除0,1,2以外的所有內容,因為其他地方沒有數字,因此您只需要使用: \\d+並遍歷匹配項即可。

但讓我們假設示例實際上可能是\\9{1,2,3}

現在\\d+將與9匹配,為避免這種情況,我們可以使用[{,](\\d+)[,}] 這表示,攻克一批具有或者是,{在它和左側,}右側。

您說的很對,我們可以使用單個正則表達式來匹配整個字符串,就像這樣:

(\\\w){((\d+),?)+}    

但是,這樣做的問題是,當您隨后檢查捕獲組的內容時,由(\\d+)捕獲的最后一個數字將覆蓋在那里捕獲的所有其他值。 因此,在示例中,您將剩下第1組: \\m和第2組: 2

考慮到這一點,我建議使用2個正則表達式:

對於第一部分: \\\\\\w

對於數字:我會忘記[{,](\\d+)[,}] (以及您可以使用的許多其他方式),最干凈的方法可能只是搶奪{...} ,然后與簡單的\\d+匹配。

因此,要執行此操作,請首先使用(\\\\\\w)\\{([^/}]+)\\}\\m放入組1,並將1,2,3放入組2,然后在該組上使用\\d+

僅供參考,您的(?<=\\{)([^}]*)(?=\\})可以正常工作,但您只能在后面隱藏\\\\\\w之前進行任何操作。 在絕大多數情況下,可以使用向后查找,您可以通過使用捕獲組並忽略其他所有內容來完成所需的操作:

我的正則表達式\\{([^/}]+)\\}與您(?<=\\{)([^}]*)(?=\\})幾乎相同,只是前瞻和后瞻{}我只是將它們留在將要使用的捕獲組之外。

考慮以下正則表達式...

(^.*?)(?={.*})
\d+

祝好運!

暫無
暫無

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

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