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>の間の任意の文字を、正規表現を使用して空の文字列に置き換えますか?

オカレンス間の文字列を置き換えます

2つの文字列の間の文字列を置き換える

現在のコード:

    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を使用した空の文字列の間にある任意の文字を置き換えますか?これは私が以前に投稿したリンクの1つであり、必要なものを処理できないと思ったため、この構文をスキップしました。

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

引用符内の文字列に引用符自体が含まれていないと仮定すると、次の一般的なパターンを使用して、プレフィックスとサフィックスの間の位置を見つけることができます。

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

あなたの場合

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

ここでは、単語の文字 (変数) を示し、等号と引用符\w+="である接頭辞を使用しています。\w+="

.*?次の引用に遭遇するまで、何かを見つけたいと思っています。

接尾辞は単に quote"です。

string result = Regex.Replace(input, "(?<=\\w+=\").*?(?=\")", replacement);
于 2013-01-08T23:18:40.673 に答える
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 に答える
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 に答える
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;

このコード サンプルは、AnyText: と <usernameredacted@example.com> の間の任意の文字を正規表現を使用して空の文字列に置き換えますか?で見つけました。これは私が以前に投稿したリンクの 1 つであり、必要なものを処理できないと思ったため、この構文をスキップしました。

于 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 に答える