有没有办法在Matlab正则表达式中捕获非捕获组内的标记?这是具体问题:
InputString = 'Identifiers: 10 12 1 3 8 6 4 2'
Expression = 'Identifiers:\s(?:(\d*)\t?)+'
regexp(InputString, Expression, 'tokens')
我需要在'Identifier'之后找到数字。字符串InputString是一个大字符数组的一部分,在该行之前和之后有行,用\ r \ n字符分隔。冒号后面的字符是一个空格,数字由制表符分隔。最后一个数字没有尾随选项卡。数字的数量可以变化,但它总是至少为1,只有1或n位的整数。
我在Expression
中有以下想法:按Identifiers:\s
标识行,找到n> 1位数的数字和(\d*)\t
捕获的令牌和可能的尾随标签,并重复此1或更多次+
。要重复数字部分表达式,我需要将其放在一个组中。但我不想捕获外部组(?:(\d*)\t?)
的标记,但当然是内部分组(\d*)
的标记。这就是我使用?:
的原因。当我删除?:
时,只返回一个包含1012138642
的标记。
是否有可能在非捕获组内捕获令牌?您是否有任何解决方案可以在一个声明中返回数字?
在我目前的解决方案中,我找到了
行Expression = 'Identifiers:.+?\r\n'
Line = regexp(InputString, Expression, 'match')
并使用
获取数字regexp(Line, '(\d+)\t+', 'tokens')
我花了很多时间找到一个语句解决方案,我现在真的需要知道它是否可能!我不确定我是否在想错,我的脑袋没有按预期工作,或者只是不可能。
答案 0 :(得分:2)
MATLAB不支持嵌套令牌,即使您将它们标记为非捕获也是如此。
从16b开始,有一些新的文本操作可以使这更容易:
str = "Identifiers: 10 12 1 3 8 6 4 2" + newline + "Blah";
str = str.extractBetween("Identifiers: ",newline).split
str =
8×1 string array
"10"
"12"
"1"
"3"
"8"
"6"
"4"
"2"
如果您的目标是使用正则表达式的一个语句,则使用拆分可能会让您更接近。
str = regexp(str,'(?<=Identifiers[^\n]*)\s*(?=[^\n]*)','split')
str =
1×10 string array
"Identifiers:" "10" "12" "1" "3" "8" "6" "4" "2" "Blah"