2011-05-05 86 views
25

我有一個很長的字符串和內該字符串我有以下文字:匹配和替換

"formatter": "SomeInformationHere" 

我需要找到一長串內上面的文字,並刪除周圍雙引號SomeInformationHere所以結果如下圖所示,但「格式化程序」一詞的引號必須保留。

"formatter": SomeInformationHere 

我試過以下,它找到了這個字符串,但我不知道如何更換圍繞價值SomeInformationHere只是引號:

string pattern = "\"formatter\": ([\"]).*([\"])"; 
Match match = Regex.Match(myString, pattern, RegexOptions.IgnoreCase); 
//Replace text in "myString" here 
myString = ????? 
//Output match value: 
Response.Write(match.Value); 

編輯:哦,我忘了提到上面的模式可能不止一次地在「mystring」中,並且所有的都需要替換它們。


編輯2:

我看了一下正則表達式測試網站(感謝您的鏈接),並在我的測試字符串和正則表達式粘貼,似乎在工作,但是當我把相同的模式放入網絡中,替換似乎就像選擇了「單行」選項一樣工作。以下是我用過的代碼。

  1. 字符串 - 注意,這不包含任何回車 - 它已經從一個XML文件中建一個長字符串。格式化以提高可讀性。

    { 
         "chart": { 
           "borderRadius": 15, 
           "borderWidth": 1, 
           "renderTo": "ChartContainer1", 
           "type": "pie" 
         }, 
         "credits": { 
           "enabled": false 
         }, 
         "labels": { 
           "items": [{ 
             "html": "Label 1", 
             "style": { 
               "left": "10px", 
               "top": "30px" 
             } 
           }, { 
             "html": "Label 2", 
             "style": { 
               "left": "10px", 
               "top": "50px" 
             } 
           }, { 
             "dummy": null 
           }] 
         }, 
         "plotOptions": { 
           "pie": { 
             "allowPointSelect": true, 
             "cursor": "pointer", 
             "showInLegend": true 
           } 
         }, 
         "series": [{ 
           "data": [{ 
             "name": "Firefox", 
             "y": 45.0 
           }, { 
             "name": "IE", 
             "y": 26.8 
           }, { 
             "name": "Chrome", 
             "selected": true, 
             "sliced": true, 
             "y": 12.8 
           }, { 
             "name": "Safari", 
             "y": 8.5 
           }, { 
             "name": "Opera", 
             "y": 6.2 
           }, { 
             "name": "Others", 
             "y": 0.7 
           }], 
           "name": "Browser share" 
         }, { 
           "dummy": null 
         }], 
         "test": { 
           "formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \u0027+ this.y +\u0027 %\u0027;}" 
         }, 
         "title": { 
           "align": "center", 
           "text": "Your chart title here" 
         }, 
         "tooltip": { 
           "formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \u0027+ this.y +\u0027 %\u0027;}" 
         } 
    } 
    

正如你可以靠近底部旁邊的「測試」和「工具提示」看我有「格式化」的一部分。我正在使用的圖案當上面的字符串全部在測試儀中的幾行(帶有CR)時,但是當我把它放在一條線上時它應該是那麼圖案不起作用

。我使用的NET代碼/模式是:

string pattern = "(\"formatter\":)\"(.*)\"(})"; 
var regex = new Regex(pattern, RegexOptions.IgnoreCase); 
aJSON = regex.Replace(aJSON, "$1$2$3"); 

再次感謝。但我仍然無法使模式在測試儀中正常工作。

目標字符串中的正則表達式測試網站(無CRS)

{"chart": {"borderRadius": 15, "borderWidth": 1, "renderTo": "ChartContainer1", "type": "pie" }, "credits": {"enabled": false }, "labels": { "items": [ {"html": "Label 1", "style": {"left": "10px", "top": "30px" } }, {"html": "Label 2", "style": {"left": "10px", "top": "50px" } }, {"dummy": null } ] }, "plotOptions": {"pie": {"allowPointSelect": true, "cursor": "pointer", "showInLegend": true } }, "series": [ { "data": [ {"name": "Firefox", "y": 45.0 }, {"name": "IE", "y": 26.8 }, {"name": "Chrome", "selected": true, "sliced": true, "y": 12.8 }, {"name": "Safari", "y": 8.5 }, {"name": "Opera", "y": 6.2 }, {"name": "Others", "y": 0.7 } ], "name": "Browser share" }, {"dummy": null } ], "test": {"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \u0027+ this.y +\u0027 %\u0027;}" }, "title": {"align": "center", "text": "Your chart title here" }, "tooltip": {"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \u0027+ this.y +\u0027 %\u0027;}" } } 

我現在發現,似乎工作,並找到字符串中的多個匹配正確的模式。在這裏發佈完成。

串圖案= 「(\」 格式化\ 「:)\」(。[^ \ 「] *)\」「;

+0

是否總是與'「格式化」開始'也可以是完全不同的東西? – 2011-05-05 15:08:26

+3

http://regexhero.net/tester/是一個很棒的工具來測試正則表達式。如果你還不知道。 – 2011-05-05 15:23:09

回答

22

其他人都已經幾乎使用捕獲組和替換釘它,只是想提供一點更多的背景:

在此處使用的主要有兩件事是Named Capturing GroupsSubstitutions

static void Main(string[] args) { 

    var input = new[] { 
     "\"formatter\": \"John\"", 
     "\"formatter\": \"Sue\"", 
     "\"formatter\": \"Greg\"" 
    }; 

    foreach (var s in input) { 
     System.Console.Write("Original: [{0}]{1}", s, Environment.NewLine); 
     System.Console.Write("Replaced: [{0}]{1}", ReFormat(s), Environment.NewLine); 
     System.Console.WriteLine(); 
    } 

    System.Console.ReadKey(); 
} 

private static String ReFormat(String str) { 
    //Use named capturing groups to make life easier 
    var pattern = "(?<label>\"formatter\"): ([\"])(?<tag>.*)([\"])"; 

    //Create a substitution pattern for the Replace method 
    var replacePattern = "${label}: ${tag}"; 

    return Regex.Replace(str, pattern, replacePattern, RegexOptions.IgnoreCase); 
} 
3

使用此:

string longString = @"""formatter"": ""SomeInformationHere"""; 
string pattern = "(\"formatter\":)([\"])(.*)([\"])"; 
string result = Regex.Replace(longString, pattern, "$1$3"); 

這會將所有找到的匹配替換爲匹配的第二個和第四個子組。完整匹配是第一個子組($0),括號中的所有部分都創建一個新的子組。

13

可以使用Regex.Replace方法是這樣的:

string pattern = "\"formatter\": \"(.*)\""; 
myString = Regex.Replace(myString, pattern, "\"formatter\": $1"); 
0
var pattern = @"^(\s*""formatter""\s*:\s*)[""](.*)[""](\s)*$"; 
var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.Multiline); 
myString = regex.Replace(myString, "$1$2$3"); 
+0

我在http://regexhero.net/tester/上試了一下你的表達,但沒有奏效。我不得不逃避所有雙引號,也無法解析「格式化程序」:「顯示信息」,在「格式化程序」之後有額外的空間 ^(\ s * \「formatter \」:\ s *)[\「 ](。*)[\「](\ s)* $ – 2011-05-05 15:19:47

+0

@Doug Chamberlain:當然,如果您想在測試程序中測試它,您必須使雙引號單一 - 它們會以字符串形式進行轉義,這就是爲什麼它們是雙倍的。實際的正則表達式是'^(\ s *「formatter」:\ s *)[「](。*)[」](\ s)* $'。它在.net中工作,經過測試。但你說得對,'formatter'後面的空格不見了,我更新了正則表達式。另外'Multiline'和'^'和'$'可以保證每對都在單線上並且不會像其他答案一樣導致可能的衝突的情況。 – 2011-05-05 15:27:13

+0

另外,您必須在測試工具中檢查* Multiline *。 – 2011-05-05 15:28:45

1

最有可能「更換看來,如果工作‘單線’選項已經被選中」東陽最初使用你的正則表達式匹配正確達14符號

**"formatter": "SomeInformationHere"** 

,但之後它會匹配每個符號,不管它是什麼,包括下一個雙引號的拳頭髮生,它會繼續直到第一個新行。 *表達式因爲貪婪而起作用(檢查貪婪vs懶惰正則表達式)。 所以我假設你只有修改

"\"formatter\": ([\"]).*([\"])" 

"\"formatter\": ([\"]).*?([\"])"