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

Заменить любую строку между кавычками

Проблема:

Невозможно найти последовательный способ заменить случайную строку между кавычками на определенную строку, которую я хочу. Любая помощь будет принята с благодарностью.

Пример:

String str1 = "test=\"-1\"";

должен стать

String str2 = "test=\"31\"";

но также работает для

String str3 = "test=\"foobar\"";

В основном я хочу включить этот

String str4 = "test=\"antyhingCanGoHere\"";

в этот

String str4 = "test=\"31\"";

Попробовали:

Нечувствительное к регистру Regex без использования перечисления RegexOptions

Как сделать замену строки без учета регистра с помощью регулярных выражений?

Заменить любой символ между AnyText: и < [email protected]example.com > с пустой строкой с использованием Regex?

Заменить строку между вхождениями

Заменить строку между двумя строками

Текущий код:

    Regex RemoveName = new Regex("(?VARIABLE=\").*(?=\")", RegexOptions.IgnoreCase);
    String convertSeccons = RemoveName.Replace(ruleFixed, "31");

Возвращает ошибку:

System.ArgumentException was caught
  Message=parsing "(?VARIABLE=").*(?=")" - Unrecognized grouping construct.
  Source=System
  StackTrace:
       at System.Text.RegularExpressions.RegexParser.ScanGroupOpen()
       at System.Text.RegularExpressions.RegexParser.ScanRegex()
       at System.Text.RegularExpressions.RegexParser.Parse(String re, RegexOptions op)
       at System.Text.RegularExpressions.Regex..ctor(String pattern, RegexOptions options, Boolean useCache)
       at System.Text.RegularExpressions.Regex..ctor(String pattern, RegexOptions options)
       at application.application.insertGroupID(String rule) in C:\Users\winserv8\Documents\Visual Studio 2010\Projects\application\application\MainFormLauncher.cs:line 298
       at application.application.xmlqueryDB(String xmlSaveLocation, TextWriter tw, String ruleName) in C:\Users\winserv8\Documents\Visual Studio 2010\Projects\application\application\MainFormLauncher.cs:line 250
  InnerException: 

найден ответ

string s = Regex.Replace(ruleFixed, "VARIABLE=\"(.*)\"", "VARIABLE=\"31\"");
ruleFixed = s;

Я нашел этот образец кода в Replace any character между AnyText: и с пустой строкой с использованием Regex? который является одной из ссылок, которые я ранее размещал, и просто пропустил этот синтаксис, потому что я думал, что не будет обрабатывать то, что мне нужно.

4b9b3361

Ответ 1

string s = Regex.Replace(ruleFixed, "VARIABLE=\"(.*)\"", "VARIABLE=\"31\"");
ruleFixed = s;

Я нашел этот образец кода в Заменить любой символ между AnyText: и < [email protected] > с пустой строкой, использующей Regex?, которая является одной из ссылок, которые я ранее размещал, и просто пропустил этот синтаксис, потому что я думал, что не будет обрабатывать то, что мне нужно.

Ответ 2

var str1 = "test=\"foobar\"";
var str2 = str1.Substring(0, str1.IndexOf("\"") + 1) + "31\"";

При необходимости добавьте проверку для IndexOf!= -1

Ответ 3

Я не знаю, понял ли я вас правильно, но если вы хотите заменить все символы внутри string, почему вы не используете обычное регулярное выражение

String str = "test=\"-\"1\"";

Regex regExpr = new Regex("\".*\"", RegexOptions.IgnoreCase);
String result = regExpr.Replace(str , "\"31\"");

Console.WriteLine(result);

печатает:

test="31"

Примечание.. Вы можете использовать простой старый XAttribute

String ruleFixed = "test=\"-\"1\"";

var splited = ruleFixed.Split('=');
var attribute = new XAttribute(splited[0], splited[1]);

attribute.Value = "31";

Console.WriteLine(attribute);//prints test="31"

Ответ 4

В том случае, если в вашей строке есть другие вещи, кроме пары ключей/значений key="value", вам нужно сделать элемент соответствия значения не совпадающим с метками кавычек, или он будет полностью соответствовать первое значение для последней метки кавычки в строке.

Если это правда, попробуйте следующее:

Regex.Replace(ruleFixed, "(?<=VARIABLE\s*=\s*\")[^\"]*(?=\")", "31");

Это использует отрицательный внешний вид для соответствия части VARIABLE=" (с дополнительным пробелом вокруг него, поэтому VARIABLE = " будет работать, а также отрицательный внешний вид в соответствии с окончанием ", без включения look- впереди/сзади в финальном матче, позволяя вам просто заменить нужное значение.

Если нет, тогда ваше решение будет работать, но не оптимально, потому что вам нужно повторить значение и метки кавычки в тексте замены.

Ответ 5

var parts = given.Split('=');
return string.Format("{0}=\"{1}\"", parts[0], replacement);

Ответ 6

Предполагая, что строка внутри кавычек не содержит самих кавычек, вы можете использовать этот общий шаблон, чтобы найти позицию между префиксом и суффиксом:

(?<=prefix)find(?=suffix)

В вашем случае

(?<=\w+=").*?(?=")

Здесь мы используем префикс \w+=", где \w+ обозначает символы слова (переменная) и =" - знак равенства и цитата.

Мы хотим найти что-нибудь .*?, пока не встретим следующую цитату.

Суффикс - это просто цитата ".

string result = Regex.Replace(input, "(?<=\\w+=\").*?(?=\")", replacement);

Ответ 7

Попробуйте следующее:

[^"\r\n]*(?:""[\r\n]*)*

Ответ 8

     String str1 = "test=\"-1\"";
     string res = Regex.Replace(str1, "(^+\").+(\"+)", "$1" + "31" + "$2");

Ответ 9

var pattern = "\"(.*)?\"";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
var replacement = regex.Replace("test=\"hereissomething\"", "\"31\"");

Ответ 10

String str1 = "test=\"-1\"";
string[] parts = str1.Split(new[] {'"'}, 3);
string str2 = parts.Length == 3 ? string.Join(@"\", parts.First(), "31", parts.Last()) : str1;

Ответ 11

Мне очень плохо в RegEx, но вы можете сделать простой ExtensionMethod, используя строковые функции, чтобы сделать это.

public static class StringExtensions
{
    public static string ReplaceBetweenQuotes(this string str, string replacement)
    {
        if (str.Count(c => c.Equals('"')) == 2)
        {
            int start = str.IndexOf('"') + 1;
            str = str.Replace(str.Substring(start, str.LastIndexOf('"') - start), replacement);
        }
        return str;
    }
}

Использование:

 String str3 = "test=\"foobar\"";
 str3 = str3.ReplaceBetweenQuotes("31");

returns: "test=\"31\""