2010-11-12 2 views
3

У меня есть регулярное выражение, которое я использую для извлечения двух частей имя папки:.NET Regular Expression - Создать строку?

([0-9]{8})_([0-9A-Ba-c]+)_BLAH 

Нет проблем. Это будет соответствовать 12345678_abc_BLAH - у меня есть «12345678» и «abc» в двух группах.

Возможно ли создать имя папки, предоставив метод с двумя строками и вставив их в группы шаблона?

public string ConstructFolderName(string firstGroup, string secondGroup, string pattern) 
{ 

    //Return firstGroup_secondGroup_BLAH 

} 

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

ответ

2

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

private Regex captures = new Regex(@"\(.+?\)"); 

public string ConstructFolderName(string firstGroup, string secondGroup, string pattern) 
{ 
    MatchCollection matches = captures.Matches(pattern); 

    return pattern.Replace(matches[0].Value, firstGroup).Replace(matches[1].Value, secondGroup); 
} 

Очевидно, что это не проверка ошибок и может быть лучше выполнена с помощью другого метода, кроме String.Replace; но это, безусловно, работает и должно дать вам некоторые идеи.

EDIT: явное улучшение было бы на самом деле использовать шаблон для проверки firstGroup и secondGroup строк, прежде чем строить их. Элементы 0 и MatchCollection 0 и 1 могут создать собственное Regex и выполнить там матч. Я могу добавить это, если хотите.

EDIT2: Вот подтверждение я говорил:

private Regex captures = new Regex(@"\(.+?\)"); 

public string ConstructFolderName(string firstGroup, string secondGroup, string pattern) 
{ 
    MatchCollection matches = captures.Matches(pattern); 

    Regex firstCapture = new Regex(matches[0].Value); 

    if (!firstCapture.IsMatch(firstGroup)) 
     throw new FormatException("firstGroup"); 

    Regex secondCapture = new Regex(matches[1].Value); 

    if (!secondCapture.IsMatch(secondGroup)) 
     throw new FormatException("secondGroup"); 

    return pattern.Replace(firstCapture.ToString(), firstGroup).Replace(secondCapture.ToString(), secondGroup); 
} 

Кроме того, я мог бы добавить, что вы можете изменить вторую группу захвата к ([0-9ABa-c]+), так как А к В самом деле не диапазон.

+0

Большое спасибо - это прекрасно. Я знал, что это никогда не будет самым изящным решением, но оно решает проблему управления шаблоном в разных местах. – youwhut

3

Вы хотите использовать String.Format?

String.Format Method (String, Object[])

+0

Ах, так что я упустил что-то очевидное! Спасибо вам за помощь. – youwhut

+0

Просто, чтобы быть ясным. Могу ли я сделать что-то вроде String.Format (pattern, firstGroupValue, secondGroupValue)? Я хочу использовать ([0-9] {8}) _ ([0-9A-Ba-c] +) _ BLAH как шаблон. Это находится в файле конфигурации, и я хочу, чтобы он оставался одним параметром. – youwhut

+0

Нет, это не сработает для вас. –