使用正则表达式提取子字符串

时间:2016-07-09 16:15:36

标签: regex matlab

我有一个字符串,实际上是一个目录文件名。

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

我需要用matlab提取目标子串'UA0001A'(我想所有工具应该具有相同的语法)。 它不必是精确的'UA0001A',它是任意字母数字组合。 为了使它更通用,我想认为子串(或单词)应满足

  1. 这是一个字母数字组合词

  2. 它不能是纯字母词或纯数字

  3. 它不能包含'midd''midd3''Midd3''MIDD3'等,因此可能会使用大小写密集的方法来排除以{{1开头的单词}}

  4. 不能包含'midd'

  5. 如何编写正则表达式来查找目标子字符串?

    提前致谢!

2 个答案:

答案 0 :(得分: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+)) - 如果在0+字母或数字后有middy +位数+ m +位数,则会导致匹配失败的否定前瞻
  • (?=[^\W_]*\d) - 在0+数字或字母([^\W_]*)之后需要至少1位数的正向前瞻
  • (?=[^\W_]*[a-zA-Z]) - 在0+字母或数字之后必须至少有一个字母
  • ([^\W_]+) - 第1组(将提取的内容)匹配1个以上的字母或数字(或非字字符和_以外的1个字符)。

'tokens'“模式”将允许您提取捕获的值而不是整个匹配。

请参阅IDEONE demo

答案 1 :(得分:0)

这应该让你开始:

[\\](?i)(?!.*midd.*)([a-z]+[0-9]+[a-z0-9]*|[a-z]+[0-9]+[a-z0-9]*)
  • [\\]:匹配反斜杠
  • (?i):正则表达式的其余部分不区分大小写
  • ?!以下匹配项无法与此匹配
  • (?!.*midd.*):以下匹配不能是任何字符,中间,任何字符的单词
  • ([a-z]+[0-9]+[a-z0-9]*|[a-z]+[0-9]+[a-z0-9]*)匹配至少一个数字,后跟至少一个字母或至少一个字母后跟至少一个数字后跟任意数量的字母和数字(记住,不能匹配?!组所以没有包含mid
  • 的单词