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

Regex 用正则表达式提取子字符串,regex,matlab,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',它是任意字母数字组合。 为了更一般,我认为子字符串(或单词)应该满足 它是一个字母数字组合词 它不能是纯字母词或纯

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

str='\\198.168.0.10\share\ccdfiles\UA-midd3-files\UA0001A_15_Jun_2014_08.17.49\Midd3\y12m05d25h03m16.midd3'
我需要用matlab提取目标子字符串
'UA0001A'
(我认为所有工具都应该有相同的语法)。 它不必是精确的
'UA0001A'
,它是任意字母数字组合。 为了更一般,我认为子字符串(或单词)应该满足

  • 它是一个字母数字组合词

  • 它不能是纯字母词或纯数字词

  • 它不能包括
    'midd'
    'midd3'
    'midd3'
    'midd3'
    等,因此可以使用大小写密集型方法排除以
    'midd'
    开头的单词

  • 它不能包括
    'y[0-9]{2,4}m[0-9]{1,2}d[0-9]{1,2}\w*'

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


    提前谢谢

    这应该让您开始:

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

    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})
    

    图案说明

    • (?i)
      -不区分大小写的修饰符
    • \\
      -文字反斜杠
    • (?![^\W\u]*(midd | y\d+m\d+)
      -如果0+字母或数字后有
      midd
      y
      +数字+
      m
      +数字,则会导致匹配失败的负面前瞻
    • (?=[^\W\uU]*\ d)
      -一种正向前瞻,要求0+位或字母后至少有1位(
      [^\W\uU]*
    • (?=[^\W\u]*[a-zA-Z])
      -0+字母或数字后必须至少有一个字母
    • ([^\W_]+)
      -第1组(提取内容)匹配1+个字母或数字(或1+个字符,非单词字符和
    “令牌”
    “模式”将允许您提取捕获的值,而不是整个匹配


    请参见

    子字符串是否始终由“\”和“\”分隔?这将使事情变得更容易。我想它应该由一个非-(字母或数字)字符分隔,例如目录文件名中可能出现的“\”、“,”、“-”、“\u8”等。请尝试Hi Wiktor,非常感谢,它很有效。请你做一个正式的回答,并解释一下模式字符串,这样我就可以投票了?虽然我认为目标子字符串“UA0001A”不一定以“\”开头,但它可能是“…\syx\u UA0001A\u…”,因此它将以非字母/数字字符分隔。你好,鲁本,非常感谢!但似乎(?!*midd.*)删除所有内容。但是我没有足够的知识来纠正它。和([a-z]+[0-9]+|[a-z]+[0-9])部分似乎与UA0001、graf3等匹配,但不匹配UA0001AI不确定为什么会这样?!接线员好像帮你把它弄坏了。你能在你的问题中提供一个有效的代码片段吗!如果目标子字符串“UA0001A”不一定以“\”开头,它可能在“\syx\u UA0001A”中,因此它将用非字母/数字字符分隔,该怎么办?非常感谢,Wiktor!您知道,您的规则非常通用,而示例字符串非常具体。我将模式锚定在
    \
    。如果可能存在
    \
    ,请将
    \\
    替换为
    (?:\\\\\\\u)
    。看见