12

问题:

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

例子:

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

应该成为

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

但也为

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

基本上我想把这个

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

进入这个

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

试过:

不使用 RegexOptions 枚举的不区分大小写的正则表达式

如何使用正则表达式进行不区分大小写的字符串替换?

使用正则表达式将 AnyText: 和 <usernameredacted@example.com> 之间的任何字符替换为空字符串?

在出现之间替换字符串

在两个字符串之间替换一个字符串

当前代码:

    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 in between AnyText: and with an empty string using Regex? 找到了这个代码示例?这是我之前发布的链接之一,只是跳过了这个语法,因为我认为它不能处理我需要的东西。

4

11 回答 11

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

如果需要添加检查IndexOf!= -1

于 2013-01-08T22:08:36.577 回答
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"
于 2013-01-08T22:08:48.243 回答
1

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

如果这是真的,那么试试这个:

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

这使用负后瞻来匹配VARIABLE="部分(周围有可选的空白,所以VARIABLE = "也可以工作,负前瞻来匹配结尾",而不包括在最终匹配中的前瞻/后视,使您能够替换你想要的值。

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

于 2013-01-08T22:11:54.457 回答
1
var parts = given.Split('=');
return string.Format("{0}=\"{1}\"", parts[0], replacement);
于 2013-01-08T22:21:13.263 回答
1

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

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

在你的情况下

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

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

.*?在遇到下一个报价之前,我们想找到任何东西。

后缀就是引号"

string result = Regex.Replace(input, "(?<=\\w+=\").*?(?=\")", replacement);
于 2013-01-08T23:18:40.673 回答
0

试试这个:

[^"\r\n]*(?:""[\r\n]*)*
于 2013-01-08T22:10:41.330 回答
0
     String str1 = "test=\"-1\"";
     string res = Regex.Replace(str1, "(^+\").+(\"+)", "$1" + "31" + "$2");
于 2013-01-08T22:12:18.210 回答
0
var pattern = "\"(.*)?\"";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
var replacement = regex.Replace("test=\"hereissomething\"", "\"31\"");
于 2013-01-08T22:12:27.107 回答
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?找到了这个代码示例?这是我之前发布的链接之一,只是跳过了这个语法,因为我认为它不能处理我需要的东西。

于 2013-01-08T22:13:34.973 回答
0
String str1 = "test=\"-1\"";
string[] parts = str1.Split(new[] {'"'}, 3);
string str2 = parts.Length == 3 ? string.Join(@"\", parts.First(), "31", parts.Last()) : str1;
于 2013-01-08T22:21:14.653 回答
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\"" 
于 2013-01-08T22:24:41.723 回答