2016-07-09 3 views
1

У меня есть строка, на самом деле это имя файла каталога.extract substring с регулярным выражением

str='\\198.168.0.10\share\ccdfiles\UA-midd3-files\UA0001A_15_Jun_2014_08.17.49\Midd3\y12m05d25h03m16.midd3' 

Мне нужно извлечь целевой подстроку 'UA0001A' с MATLAB (ну я хотел бы думать, все инструменты должны иметь такой же синтаксис). Не обязательно быть точным 'UA0001A', это произвольная комбинация букв и цифр. Чтобы сделать его более общим, я хотел бы думать, подстрока (или слово), должна удовлетворять

  1. это алфавит номер Словосочетание

  2. не может быть чистым алфавит слова или чистый номер слово

  3. не может включать в себя 'midd' или 'midd3' или 'Midd3' или 'MIDD3' и т.д., поэтому может использовать метод случая ресурсоемких исключить слово начинается с 'midd'

  4. не может включать в себя 'y[0-9]{2,4}m[0-9]{1,2}d[0-9]{1,2}\w*'

Как написать регулярное выражение, чтобы найти целевую подстроку?

Заранее благодарен!

+0

является подстрока всегда ограничена "\" и "_"? это сделало бы вещи намного проще. –

+0

Я хотел бы думать, что он должен быть отделен символом non (алфавит или число), таким как «\», «.», «», «-», «_» и т. д., который может встречаются в имени файла каталога. –

+0

Попробуйте ['regexp (s, '(? I) \\ (?! [^ \ W _] * (midd | y \ d + m \ d +)) (? = [^ \ W _] * \ d) (? = [^ \ W_] * [a-zA-Z]) ([^ \ W_] +) ',' tokens '); '] (http://ideone.com/hBAVpz) –

ответ

1

Вы можете использовать

s = '\\198.168.0.10\share\ccdfiles\UA-midd3-files\UA0001A_15_Jun_2014_08.17.49\Midd3\y12m05d25h03m16.midd3'; 
res = regexp(s, '(?i)\\(?![^\W_]*(midd|y\d+m\d+))(?=[^\W_]*\d)(?=[^\W_]*[a-zA-Z])([^\W_]+)','tokens'); 
disp(res{1}{1}) 

См the regex demo

Узор объяснение:

  • (?i) - модификатор регистронезависимым
  • \\ - дословный обратный слэш
  • (?![^\W_]*(midd|y\d+m\d+)) - отрицательный предпросмотр, который провалить матч, если есть midd или y + цифры + m + цифры после 0+ букв или цифр
  • (?=[^\W_]*\d) - положительный предпросмотр, который требует, по меньшей мере, 1 цифру после 0+ цифр или букв ([^\W_]*)
  • (?=[^\W_]*[a-zA-Z]) - должно быть по крайней мере одна буква после 0+ букв или цифр
  • ([^\W_]+) - Группа 1 (что извлечет) соответствие 1+ букв или цифр (или 1+ символы кроме символов, отличных от слов, и _).

Режим «'tokens'» позволит вам извлечь захваченное значение, а не весь матч.

См IDEONE demo

+0

Привет, Виктор, спасибо! Что делать, если целевая подстрока «UA0001A» может не обязательно начинаться с «\», она может быть в «* \ syx_UA0001A_ *», поэтому она будет отделена символом не алфавита/цифры? –

+0

Большое спасибо, Wiktor! –

+0

Вы знаете, что ваши правила очень общие, в то время как строки примеров очень специфичны. Я привязал шаблон к '' \ ''. Если может быть '_', замените' '\\' 'на' (?: \\ | _) '. См. ['(? I) (?: \\ | _) (?! [^ \ W _] * (midd | y \ d + m \ d +)) (? = [^ \ W _] * \ d) (? = [^ \ W _] * [A-Za-Z]) ([^ \ W _] +) '] (https://regex101.com/r/qL5jA9/2). –

0

это поможет вам начать:

[\\](?i)(?!.*midd.*)([a-z]+[0-9]+[a-z0-9]*|[a-z]+[0-9]+[a-z0-9]*) 
  • [\\]: соответствует обратной косой черты
  • (?i): остальная часть регулярных выражений чувствителен к регистру
  • ?! следующий матч не может соответствовать этой
  • (?!.*midd.*): следующий матч не может быть словом, у которого есть любой символ, midd, любой символ
  • ([a-z]+[0-9]+[a-z0-9]*|[a-z]+[0-9]+[a-z0-9]*) соответствует хотя бы одному номеру, за которым следует хотя бы одна буква ИЛИ, по крайней мере, одна буква, за которой следует хотя бы одно число, за которым следует любое количество букв и цифр (, не может совпадать??группа так ни слова, не содержащая середины)
+0

Привет, Рубен, большое спасибо! но кажется (?!. * midd. *) удаляет все. Но у меня недостаточно знаний, чтобы исправить это. и ([az] + [0-9] + | [az] + [0-9]), кажется, соответствует UA0001, graf3 и т. д., но не UA0001A –

+0

действительно, исправил его в моем ответе –

+0

Я не уверен Почему ?! оператор, похоже, сломает его для вас. Можете ли вы предоставить фрагмент рабочего кода в своем вопросе –

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