Заменить любую строку между кавычками
Проблема:
Невозможно найти последовательный способ заменить случайную строку между кавычками на определенную строку, которую я хочу. Любая помощь будет принята с благодарностью.
Пример:
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? который является одной из ссылок, которые я ранее размещал, и просто пропустил этот синтаксис, потому что я думал, что не будет обрабатывать то, что мне нужно.
Ответы
Ответ 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\""