2015-09-01 3 views
0

Я работаю с некоторыми регулярными выражениями в go, а это не прямой процесс, т. Е. Требуется время, чтобы проработать и понять из элементов, которые я нашел, и быстро прочитал руководство; любой вклад в уточнение следующего будет оценен для ускорения процесса.Тонкая настройка go регулярные выражения

// {aa,bb,cc,dd, etc.}, {a+,b+,c+} 
regexp.MustCompile(`\B\{([\w-]+)(.*,)([\w-]+)(?:,[\w-]+=[\w-]+)*\}`) 
// above captures {a+, b+, c}, but not {a+,b+,c+} 

// {1-9}, {1-9,10,19,20-52} 
regexp.MustCompile(`\B\{([\d]?)-([\d]?)(?:,[\d]?=[\d]?)*\}`) 
// the first is fine, but no idea on how to do the latter, i.e. multiple ranges that might have free standing addons, tricky, maybe beyond a regexp 

// {a-f}, {A-F}, {x-C} 
regexp.MustCompile(`\B\{([a-zA-Z]?)-([a-zA-Z]?)(?:,[a-zA-Z]?=[a-zA-Z]?)*\}`) 

Я не уверен, что мне нужно (?: Часть, она что-то найти, мне просто нужно признать отдельные экземпляры последовательностей выше (разделенных запятыми, диапазон номеров, диапазон символов) в скобки {} в текст Я разбор

+0

Не знаком с 'go', но если вы просто хотите все между' {} 'как насчет просто' \ {. +? \} '? – chris85

+0

Мне нужно идентифицировать 3 типа последовательностей выше; отредактировал эту часть выше. – blueblank

+2

Часто бывает проще написать небольшой синтаксический анализатор для сложного синтаксиса, вместо того, чтобы пытаться создать одно регулярное выражение. В качестве альтернативы вы также можете разбить его на ряд регулярных выражений. – JimB

ответ

0

проблемы легче решать, если вы нарушите разбор на шаги вы могли бы начать с чем-то вроде:..

http://play.golang.org/p/ugqMmaeKEs

s := "{aa,bb,cc, dd}, {a+,\tb+,c+}, {1-9}, {1-9,10,19,20-52}, {a-f}, {A-F}, {x-C}, {}" 

// finds the groups of characters captured in {} 
matchGroups := regexp.MustCompile(`\{(.+?)\}`) 
// splits each captured group of characters 
splitParts := regexp.MustCompile(`\s*,\s*`) 

parts := [][]string{} 
for _, match := range matchGroups.FindAllStringSubmatch(s, -1) { 
    parts = append(parts, splitParts.Split(match[1], -1)) 
} 

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

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