正則平衡組在.NET下的使用
阿新 • • 發佈:2019-02-11
今天碰到一個任務,讓我從一段js程式碼中抽取出一段json資料。抽取的程式碼如下:
var videoListJSON = {
"count": 5,
"name": "Bear 101",
"clips": [
{
"clipRefId": "1f3a68a05cf6d5efcc00e5c416c92964d252cbc7",
"contentId": "842166",
"programTitle": "Porter Ridge",
//...
"aspectRatio": "16:9"
},
{
"clipRefId" : "5f9822763f58fae2ffbf050b64ffe2b0b9c787ed"
//...
},
{
"clipRefId": "5f9822763f58fae2ffbf050b64ffe2b0b9c787ed"
//...
}]};
任務就是抽取這個json變數中的clips,然後陣列中每個資料還得單獨抽取出來。
剛接到活的任務,第一反應就是用正則去匹配,但是想要準確的把想要的東西提取出來也不能單是利用簡單的規則就行了,這裡就需要使用到正則的平衡組這個特性了。(註明:以下程式碼中所使用的正則在C#裡有效,並不代表其它語言裡也能這麼寫,因為每個語言對正則表示式的某些特性的寫法是有區別的)
static string[] extractData(string input)
{
//先抽取clips後整個的字串
Regex r1 = new Regex(@"
""clips""\s*:\s*
(
\[
(
(?<open>\[)
|
(?<-open>\])
|
[^\[\]]+
)*
(?(open)(?!))
\]
)", RegexOptions.IgnorePatternWhitespace);
//匹配clips陣列中每一項
Regex r2 = new Regex(@"
{
(
(?<open>{)
|
(?<-open>})
|
[^{}]+
)*
(?(open)(?!))
}", RegexOptions.IgnorePatternWhitespace);
string clipsString = string.Empty;
List<string> clipsList = new List<string>();
Match m1 = r1.Match(input);
if (m1.Success)
{
clipsString = m1.Groups[1].Value;
}
var m2s = r2.Matches(clipsString);
foreach (Match m2 in m2s)
{
clipsList.Add(m2.Groups[0].Value);
}
return clipsList.ToArray();
}
關於正則平衡組的詳細說明,網上已有好多人寫出詳解了。具體連結參考如下: