2013-11-27 61 views
0

我正在編寫string.Format類似的方法。爲了做到這一點,我採用了Regex來確定命令和參數:例如Format(@"\m{0,1,2}", byteArr0, byteArr1, byteArr2)解析格式器字符串的正則表達式

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

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

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

  • 0
  • 1
  • 2

這些值是對應於所述byteArr PARAMS索引。

這個命令結構很可能會增長,所以我真的想弄明白這一點,並學習到足以能夠修改正則表達式以滿足未來的需求。我認爲一個正則表達式可以完成上述所有操作,但在那裏是有兩個單獨的 正則表達式(es/ices ???) 表達式的值。

任何方式,以獲得第一組'\m'的正則表達式是:

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

爲了得到整數匹配'{0,1,2}'我嘗試:

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

我有實現難度:( 1)第一個表達式上的2個組和(2) 3個大括號內的整數與第二個表達式中的逗號分隔ñ。

回答

0

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

  • 你不想單獨捕獲\m因此沒有必要將它們包裝在自己套括號。
  • \w{1,1}\w相同。

所以我們有​​匹配第一部分\m

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

但讓我們假設這個例子實際上可能是\9{1,2,3}。我們可以使用[{,](\d+)[,}]。這表示捕獲一個數字,其左側有,{,右側有,}

你在說,我們可以將整個字符串用一個正則表達式匹配是正確的,這樣的事情會做到這一點:

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

但是這個問題是當您檢查拍攝的內容之後,(\d+)捕獲的最後一個數字將覆蓋所有其他在該處捕獲的值。所以你會留下組1:\m和組2:2爲例。

考慮到這一點,我建議使用2個regexs:

對於第1部分:​​

對於數:我忘了[{,](\d+)[,}](和許多其他的方法你可以做到這一點)最簡潔的方法可能就是抓住{...}中的任何內容,然後再與簡單的\d+匹配。

因此,要做到這一點首先使用(\\\w)\{([^/}]+)\}\m成組1和1,2,3成2組,那麼就使用上\d+

僅供參考,您的(?<=\{)([^}]*)(?=\})工作正常,但您只能看到任何東西之前,即​​。

我的正則表達式\{([^/}]+)\}幾乎是一樣的,你(?<=\{)([^}]*)(?=\})除了不向前看和:在絕大多數地方可以使用回顧後發的情況下,你可以只使用捕捉組,而忽略其他一切你想要什麼在後面尋找{}我只是將它們留在將要使用的捕獲組之外。

0

考慮下面的正則表達式...

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

祝您好運!

相關問題