Заменить строку специальным символом - PullRequest
5 голосов
/ 10 июля 2019

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

Пример ввода:

Это [тестовая] версия.

Требуемый вывод (замена «[test]» на 1.0):

Это версия 1.0.

В настоящее время регулярное выражение не заменяет специальный символ. Ниже приведен код, который я пробовал:

 string input= "This is [test] version of application.";

 string stringtoFind = string.Format(@"\b{0}\b", "[test]");

 Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

В переменных input и stringtoFind могут быть любые специальные символы.

Ответы [ 5 ]

3 голосов
/ 10 июля 2019

Здесь необходимо учитывать две вещи:

  • Для специальных символов необходимо экранировать буквальный символ \, который лучше всего делать с помощью метода Regex.Escape, если динамический текст литерала передается какпеременная для регулярного выражения
  • Невозможно полагаться на границы слов, \b, поскольку значение этой конструкции зависит от непосредственного контекста.

То, что вы можете сделать, это использоватьRegex.Escape с однозначными границами слов (?<!\w) и (?!\w):

string input= "This is [test] version of application.";
string key = "[test]";
string stringtoFind = $@"(?<!\w){Regex.Escape(key)}(?!\w)";
Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

Обратите внимание, что если вы хотите заменить строку ключа, когда она заключена в пробелы, используйте

string stringtoFind = $@"(?<!\S){Regex.Escape(key)}(?!\S)";
                         ^^^^^^                    ^^^^^
2 голосов
/ 10 июля 2019

Я предполагаю, что это простое выражение может работать:

\[[^]]+\]

Test

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\[[^]]+\]";
        string substitution = @"1.0";
        string input = @"This is [test] version";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить / упростить / изменить его, а в этой ссылке вы можете посмотреть, как оно будет если хотите, сравнивайте с некоторыми примерами входных данных шаг за шагом.

2 голосов
/ 10 июля 2019

Мне кажется, это самое близкое к тому, что вы просите:

string input = "This is [test] version of application.";

string stringtoFind = Regex.Escape("[test]");

Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

Это выводит This is 1.0 version of application..

Однако в этом случае достаточно просто сделать это:

string input = "This is [test] version of application.";

Console.WriteLine(input.Replace("[test]", "1.0"));

Он делает то же самое.

0 голосов
/ 10 июля 2019
\] // Matches the ]
\[ // Matches the [

Вот шпаргалка, которую вы можете использовать в будущем https://www.rexegg.com/regex-quickstart.html#morechars

string input = "This is [test] version of application.";

string stringtoFind = string.Format(@"\[[^]]+\]", "[test]");

Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

Console.ReadKey();

https://www.regexplanet.com/share/index.html?share=yyyyujzkvyr => Демо

0 голосов
/ 10 июля 2019

Вы должны выйти из скобок и удалить \b:

 string input= "This is [test] version of application.";

 string stringtoFind = string.Format("{0}", @"\[test\]");

 Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

Выход

This is 1.0 version of application.

Важное примечание

\b не НЕ совпадение пробелов.\b соответствует пустой строке в начале или конце слова.Может быть, вы искали \s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...