[英]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.