Matlab Regexp用于嵌套组和捕获的标记

时间:2017-10-09 15:15:37

标签: regex matlab token regex-group

有没有办法在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')

我花了很多时间找到一个语句解决方案,我现在真的需要知道它是否可能!我不确定我是否在想错,我的脑袋没有按预期工作,或者只是不可能。

1 个答案:

答案 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"