Подтвердить что ты не робот

Матч и замена

У меня длинная строка и внутри. В этой строке есть следующий текст:

"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);

Изменить: О, я забыл упомянуть, что вышеупомянутая картина может быть в "мистике" более одного раза, и всем потребуется замена, выполняющая на них.


Изменить 2:

Я просмотрел сайт тестера регулярных выражений (спасибо за ссылку) и вставил в свою тестовую строку и шаблон регулярных выражений, похоже, работает в этом, но когда я помещаю тот же шаблон в точную сеть, для работы, как если бы была выбрана опция "singleline". Ниже приведен код, который я использовал.

  • Строка - Обратите внимание, что это НЕ содержит каретки - это одна длинная строка, которая была построена из 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;}"
            }
    }
    

Как вы можете видеть возле дна рядом с "test" и "tooltip", у меня есть часть "formatter:". patten, который я использую в настоящее время, когда вышеприведенная строка находится на нескольких строках (с CR) в тестере, но когда я помещаю ее в одну строку, как это должно быть, тогда шаблон не работает

Код/шаблон .NET, который я использую:

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

Еще раз спасибо. но я все еще не могу заставить шаблон правильно работать в тесте.

Целевая строка на сайте тестера REGex: (без CR)

{"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;}" } }

Теперь я нашел правильный шаблон, который, кажется, работает и находит несколько совпадений в строке. Отправьте его здесь для завершения.

string pattern = "(\" formatter\ ":) \" (. [^\ "] *) \" ";

4b9b3361

Ответ 1

Все остальные довольно много прибивали его с помощью групп захвата и подстановок, просто хотели предоставить немного больше контекста:

Основные две вещи, которые используются здесь: Именованные группы захвата и Замены

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);
}

Ответ 2

Вы можете использовать метод Regex.Replace следующим образом:

string pattern = "\"formatter\": \"(.*)\"";
myString = Regex.Replace(myString, pattern, "\"formatter\": $1");

Ответ 3

Используйте это:

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

Это заменяет все найденные совпадения со второй и четвертой подгруппами соответствия. Полное совпадение - первая подгруппа ($0), а все части в скобках создают новую подгруппу.

Ответ 4

Скорее всего, замена, похоже, работает так, как если бы была выбрана опция "одиночная линия" . beacause, изначально используемое вами регулярное выражение будет правильно соответствовать 14-му символу в

**"formatter": "SomeInformationHere"**

но после этого он будет соответствовать каждому символу-номерам, что это такое, включая следующую кучность двойных кавычек, и будет продолжаться до первой новой строки. То, как. * Выражение работает из-за его жадности (проверьте жадное против ленивого регулярного выражения). Поэтому я полагаю, что вам нужно только изменить

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

к

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

Ответ 5

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