2013-12-09 3 views
0

У меня есть некоторые текстовые материалы следующего формата:Сложное Regex Regular Expression

[РОДИТЕЛЕЙ] - [OPTION] - [OPTION]

Например

  1. BIKE -XT-MM-LX-100-BB
  2. TRICYCLE -MM-XP
  3. Мотоциклетные -X100V (-X100V не вариант здесь)

Я использую регулярные выражения отделить варианты от родителя. Отключение опции не так просто, как вы можете видеть из-за некоторых исключений. все, что следует за тире, должно быть опцией, отличной от любой, начиная с X и длиннее двух цифр, например примера №3, который -X100V не является опцией. Тогда я пошел с такими выражениями, как это отделить куски:

// Only separates 2 digit options, but we have more digit options: 
(\A[^-]+)(-\w\w\b)+ 

// 2 digits and more option which -X100V fits into also. but not an option:  
(\A[^-]+)(-\w{2,}\b)+ 

// which separates any 2 digit and longer followed by dash as an option 
// unless it is started with X (which rules out my 2 digit -XX options by mistake): 
(\A[^-]+)(-[^\BX]\w{1,}\b)+ 

Теперь мне нужно только еще один шаг, чтобы добавить правило только устранил дело с начинают с -X, но больше, чем две цифры , то я могу снова включить примеры -XT.

Я хотел бы услышать предложения.

ответ

0

Я не понимаю необходимости регулярного выражения здесь. Просто используйте String.Split и разделите на дефис. Затем вы можете повторно объединить первый, если вам нужно, если он не является «вариантом» и должен быть частью «PARENT».

Что-то вроде:

var inputString = /*your input string, e.g. "BIKE-XT-MM-LX-100-BB"*/; 
var parts = inputString.Split('-'); 

var parent = parts.First(); 
var options = parts.Skip(1).ToList(); 

//put back any non-"option"s 
while(options.Any() && options.First().StartsWith("X") && 
    options.First().Length > 3) 
{ 
    parent = String.Format("{0}-{1}", parent, options.First()); 
    options.RemoveAt(0); 
} 
+0

@Ic. действительно ценю ваш ответ. Я действительно закончил тем же. однако регулярные выражения являются мощными инструментами для получения одного и того же результата в очень короткой и довольно читаемой строке кода, и я в основном хочу узнать, как это сделать. – Mehrad

0

Если вы можете показать полный ввод текста было бы полезно.

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

\A\w+(?=-)

  1. положение Утверждай в начале строки \A. Вы также можете использовать ^

  2. Соответствует одному символу, который является символом слова (буквы, цифры и т. Д.).) \w+

  3. Между одной и неограниченное количество раз, столько раз, сколько это возможно, отдавая при необходимости (жадный) +

  4. утверждают, что ниже регулярное выражение может соответствовать, начиная с этой позиции (положительный опережения) (?=-)

  5. матч символ «-» буквально -

0

выполнить разделение регулярных выражений с использованием этого образец -(?!X[^-\r\n]{2})Demo