Добавить подстроку, если исходная строка не начинается с той же подстроки - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь создать правильный шаблон замены RegEx для правильного форматирования определенных имен файлов .XML.В частности, если имя файла не начинается с префикса, скажем, ACE_.Если имя и расширение файла XML не начинаются с ACE_, добавьте строку ACE_ к имени файла.Например, если моя исходная строка ввода выглядит следующим образом:

Widgets.xml

Я хотел бы выполнить одну замену RegEx, которая привела бы к следующей строке:

ACE_Widgets.xml.

И наоборот, если строка уже начинается с ACE_, я бы хотел, чтобы она не изменилась.

Кроме того, как можноЯ включил шаблон «.xml», чтобы гарантировать, что строковый шаблон для имени и расширения файла заканчивается на «.xml» в том же самом шаблоне сопоставления для шаблона замены RegEx?

Что касается соответствия, у меня естьнемного удачи со следующим:

^ACE_{1}[\d\D]+

Что указывает на совпадение для шаблона, если входная строка ACE_Widgets.xml, и нет совпадения, если строка Widgets.xml

RegExШаблон будет достаточно, но если вам нужно знать язык, на котором я хотел бы использовать шаблон замены, в .NET 4.0 в C # или VB.NET.

Следующая публикация близка к тому, что я ищу, но с включением префикса пути к каталогу * ix и использованием preg_replace () в PHP у меня возникли некоторые проблемызаставить его работать с тем, что мне нужно сделать:

Регулярное выражение: Как заменить строку, которая НЕ начинается с чего-то?

Как всегда, спасибо взаранее за ваше время, помощь и терпение.Они очень ценятся ...

Ответы [ 4 ]

6 голосов
/ 10 октября 2011

На самом деле регулярные выражения - довольно чистый способ сделать это. Вот решение с регулярным выражением, написанным в режиме свободного пробела с множеством комментариев:

text = Regex.Replace(text, @"
    # Match XML file names not starting with: ACE_
    ^          # Anchor to start of string.
    (?!ACE_)   # Assert does not start with ACE_
    .*         # Match filename up to extension.
    (?i)       # Make case insensitive for .xml
    \.xml      # Require XML file extension.
    $          # Anchor to end of string.", 
    "ACE_$0", RegexOptions.IgnorePatternWhitespace);

Обратите внимание, что это предполагает, что требование префикса ACE_ чувствительно к регистру.

3 голосов
/ 10 октября 2011

Здесь нет необходимости в регулярном выражении:

var fileName = …;
var prefix = "ACE_"
if (!fileName.StartsWith(prefix))
    fileName = prefix + fileName;

Если вы хотите добавить проверку для расширения .xml, добавьте:

var extension = ".xml";
if (!fileName.EndsWith(extension))
    fileName = fileName + extension;
3 голосов
/ 10 октября 2011

Если RegExp не является конкретным требованием, я предлагаю вам использовать вместо него функцию String.StartsWith () , так как она выглядит более естественно.

var filename = "Widget.xml";
if(!filename.StartsWith("ACE_"))
{
    File.Move(filename, Path.Combine(Path.GetDirectoryName(filename), string.Format("ACE_{0}", Path.GetFileName(filename)))); 
}
1 голос
/ 02 августа 2017

И в эти дни в с # 6

var fileName = "Widgets.xml"; // or "ACE_Widgets.xml"
var prefix = "ACE_"
fileName = fileName.StartsWith(prefix) ? fileName : $"{prefix}{fileName}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...