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]*)
:匹配反斜杠[\\]
:regex的其余部分不区分大小写(?i)
代码>以下匹配项不能与此匹配
:以下匹配不能是包含任何字符、midd、任何字符的单词(?!*midd.*)
匹配至少一个数字,后跟至少一个字母,或者至少一个字母,后跟至少一个数字,后跟任意数量的字母和数字(记住,无法匹配?!组,因此没有包含mid的单词)([a-z]+[0-9]+[a-z0-9]*.[a-z]+[0-9]+[a-z0-9]*)
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)
-文字反斜杠\\
-如果0+字母或数字后有(?![^\W\u]*(midd | y\d+m\d+)
或midd
+数字+y
+数字,则会导致匹配失败的负面前瞻m
-一种正向前瞻,要求0+位或字母后至少有1位((?=[^\W\uU]*\ d)
)[^\W\uU]*
-0+字母或数字后必须至少有一个字母(?=[^\W\u]*[a-zA-Z])
-第1组(提取内容)匹配1+个字母或数字(或1+个字符,非单词字符和([^\W_]+)
)。
“令牌”
“模式”将允许您提取捕获的值,而不是整个匹配
请参见子字符串是否始终由“\”和“\”分隔?这将使事情变得更容易。我想它应该由一个非-(字母或数字)字符分隔,例如目录文件名中可能出现的“\”、“,”、“-”、“\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)
。看见