2013-11-27 3 views
0

Я пишу метод string.Format-like. Чтобы сделать это, я принимаю Regex для определения команд и параметров: например. Format(@"\m{0,1,2}", byteArr0, byteArr1, byteArr2)Регулярное выражение для форматирования строки

Для первого Regex, возвращают 2 группы:

  • '\m'
  • '{0,1,2}'

Другой Regex принимает значение '{0,1,2}' и имеет 3 матча:

  • 0
  • 1
  • 2

Эти значения являются индексы, соответствующие byteArr Params.

Эта структура команд, вероятно, будет расти, поэтому я действительно пытаюсь понять это и учиться достаточно, чтобы иметь возможность модифицировать Regex для будущих требований. Я думаю, что одно Regex будет делать все вышеперечисленное, но там представляет собой значение, имеющее 2 отдельных выражения Regex (es/ices ???) .

В любом случае, чтобы получить первую группу '\m' регулярное выражение:

"(\\)(\w{1,1})" // I want the '{0,1,2}' group also 

Чтобы получить целое число матчей '{0,1,2}' я пытался:

"(?<=\{)([^}]*)(?=\})" 

Я с трудом в достижении: (1) 2 группы в первом выражении и (2) 3 совпадения по целым числам в фигурных скобках, разделенных запятой во втором выражении п.

ответ

0

Ваше первое регулярное выражение (\\)(\w{1,1}) может быть значительно упрощено.

  • Вы не хотите, чтобы захватить \ отдельно в m поэтому нет необходимости переносить их в своих собственных наборах скобки.
  • \w{1,1} - это то же самое, что и \w.

Таким образом, у нас есть \\\w, чтобы соответствовать первой части \m.

Теперь, чтобы иметь дело со второй частью, мы можем игнорировать все, кроме 0,1,2, в примере, поскольку в другом месте нет номеров, поэтому вы просто используете: \d+ и итерации по матчам.

Но давайте предположим, что пример действительно может быть \9{1,2,3}.

Теперь \d+ будет соответствовать 9, поэтому, чтобы избежать этого, мы могли бы использовать [{,](\d+)[,}].Это говорит о захвате числа, которое имеет либо ,, либо { слева, и , или } справа.

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

(\\\w){((\d+),?)+}  

Однако проблема состоит в том, когда вы исследуете содержимое захвата после этого последнее число, зацепившееся (\d+), перезаписывает все остальные значения, которые были обнаружены там. Таким образом, вы останетесь с группой 1: \m и группой 2: 2 для вашего примера.

Имея это в виду, я рекомендую использовать 2 regexs:

Для 1-й части: \\\w

Для чисел: Я бы забыть о [{,](\d+)[,}] (и многие другие способы, вы можете сделать это) , самым чистым способом может быть просто захватить все, что находится внутри {...}, а затем сопоставить с простым \d+.

Так, чтобы сделать это первое использование (\\\w)\{([^/}]+)\}, чтобы захватить \m в 1-й группе и 1,2,3 в группе 2, а затем просто использовать \d+ по этому вопросу.

FYI, ваш (?<=\{)([^}]*)(?=\}) отлично работает, но вы не можете ничего, кроме всего прочего, например, \\\w. В подавляющем большинстве случаев, когда может быть использован с просмотром назад, вы можете делать то, что вы хотите, только с помощью группы захвата и игнорируя все остальное:

Моего регулярное выражение \{([^/}]+)\} является почти таким же, как вы (?<=\{)([^}]*)(?=\}) за исключением, а не смотреть вперед и глядя за { и } Я просто оставляю их вне групп захвата, которые будут использоваться.

0

Рассмотрим следующий регулярные выражения ...

(^.*?)(?={.*}) 
\d+ 

Удачи!

Смежные вопросы