替换引号之间的任何字符串

时间:2013-01-08 22:00:45

标签: c# regex string replace

问题:

无法找到一种一致的方法来替换具有我想要的特定字符串的引号之间的随机字符串。任何帮助将不胜感激。

示例:

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

应该成为

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

但也适用于

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

基本上我想转这个

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

进入这个

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

尝试过:

Case insensitive Regex without using RegexOptions enumeration

How do you do case-insensitive string replacement using regular expressions?

Replace any character in between AnyText: and <usernameredacted@example.com> with an empty string using Regex?

Replace string in between occurrences

Replace a String between two Strings

当前代码:

    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;

我发现这个代码示例在AnyText:和使用Regex的空字符串之间替换任何字符?这是我之前发布的链接之一,只是跳过了这种语法,因为我认为它无法处理我需要的东西。

11 个答案:

答案 0 :(得分:2)

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

如果需要,请添加IndexOf!= -1

的检查

答案 1 :(得分:2)

我不知道我是否理解你是对的,但是如果你想要替换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"

答案 2 :(得分:1)

如果您的字符串除了key="value"的键/值对之外还有其他内容,那么您需要使值匹配部分匹配引号,或者它将匹配字符串中从第一个值到最后一个引号的所有方式。

如果确实如此,那就试试这个:

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

这使用负面后卫来匹配VARIABLE="部分(周围有可选的空白区域,因此VARIABLE = "也可以正常工作,而负前瞻则匹配结尾" ,不包括最终匹配中的前瞻/后退,使您只需替换所需的值。

如果没有,那么您的解决方案工作,但不是最佳的,因为您必须在替换文本中重复值和引号。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

假设引号中的字符串本身不包含引号,您可以使用此常规模式来查找前缀和后缀之间的位置:

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

在你的情况下

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

这里我们使用前缀\w+=",其中\w+表示单词字符(变量),="是等号和引号。

我们希望在遇到下一个引文之前找到任何.*?

后缀只是引用"

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

答案 5 :(得分:0)

试试这个:

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

我在Replace any character in between AnyText: and <usernameredacted@example.com> with an empty string using Regex?发现了这个代码示例,这是我之前发布的链接之一,只是跳过了这种语法,因为我认为它无法处理我需要的内容。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我在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\""