Как сравнить экземпляр строки с параметризованной строкой формата в .net - PullRequest
0 голосов
/ 16 декабря 2011

Есть ли способ в .NET проверить, что конкретный экземпляр строки соответствует заданной строке формата? Скажем, моя строка формата: «Здравствуйте, {0}!» и у меня есть «Hello, World!», чтобы использовать старый клише пример, я ищу метод сравнения, который будет возвращать true при сравнении этих. Я знаю, что мог бы написать метод расширения String для этого, но просто хочу убедиться, что я не собираюсь изобретать велосипед ...

Если кому-то интересно, я спрашиваю об этом потому, что пишу тест NUnit для проверки отображения сообщения пользователю, но мне не важно, какой код вставляется в параметры строки формата Я просто хочу проверить, что он использует.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Действительно, проще всего было бы использовать регулярные выражения, например:

var template = "Hello, {0}!";
var test = "Hello, World!";

var pattern = Regex.Replace("^"+Regex.Escape(template)+"$", "\\\\{[0-9]+\\}", ".*?");
var matches = Regex.IsMatch(test, pattern); // true if test matches template

Идея в том, что вы хотите «преобразовать» шаблон в регулярное выражение, подставляя шаблон .*? для каждого вхождения {n}, а также заключая результат в ^ и $, чтобы он соответствует в целом.

Но для этого вам нужно сначала Regex.Escape template, потому что в общем случае он может содержать символы, которые имеют особое значение в регулярных выражениях. Экранирование оставляет шаблоны типа {n}, выглядящие как \{n}, поэтому мы нацеливаемся на это, используя выражение \\\\{[0-9]+\\} в "replace {n} with. *?" часть.

2 голосов
/ 16 декабря 2011

Используйте Regex:

System.Text.RegularExpressions.Regex.Match(input, "^Hello, .*!$")
...