用于嵌套组和捕获令牌的Matlab Regexp
在Matlab正则表达式中,有没有一种方法可以在未捕获的组中捕获令牌?具体问题如下:用于嵌套组和捕获令牌的Matlab Regexp,regex,matlab,token,regex-group,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') 我需要在“标识符”后面找到数字。字符串InputString是一个大字符数组的一部分,该数组在该行之前和之后各有一行,由\
InputString = 'Identifiers: 10 12 1 3 8 6 4 2'
Expression = 'Identifiers:\s(?:(\d*)\t?)+'
regexp(InputString, Expression, 'tokens')
我需要在“标识符”后面找到数字。字符串InputString是一个大字符数组的一部分,该数组在该行之前和之后各有一行,由\r\n个字符分隔。冒号后面的字符是空白,数字由制表符分隔。最后一个数字没有尾随标签。数字的数量可能会有所不同,但它始终至少是一个且仅是一位或n位的整数
在我的表达式中,我有以下想法:通过标识符识别行:\s
,通过(\d*)\t
查找n>1位的数字和捕获的标记以及可能的尾随选项卡,并通过+
重复此操作1次或多次。要重复数字部分表达式,我需要将其分组。但是我不想捕获外部组(?:(\d*)\t?
)的标记,当然是内部组(\d*)
的标记。这就是我使用?:
的原因。当我删除?:
时,只返回一个包含1012138642
的令牌
难道不可能在非捕获组中捕获令牌吗?你有没有办法在一个语句中返回数字
在我当前的解决方案中,我通过
Expression = 'Identifiers:.+?\r\n'
Line = regexp(InputString, Expression, 'match')
然后用
regexp(Line, '(\d+)\t+', 'tokens')
我花了很多时间寻找一个单一的语句解决方案,现在我真的需要知道它是否可行!我不确定我是否想错了,我的头没有按预期工作,或者根本不可能工作。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"
如果您的目标是使用regexp的一条语句,那么使用split可能会更接近您
str = regexp(str,'(?<=Identifiers[^\n]*)\s*(?=[^\n]*)','split')
str =
1×10 string array
"Identifiers:" "10" "12" "1" "3" "8" "6" "4" "2" "Blah"
str=regexp(str,”(?看起来像\G
运算符在Matlab正则表达式中不受支持。您需要分两步执行此操作。(?:(\d*)\t?)+
有效地量化了组1。捕获组将只包含上次传递的值9 8 7 6 54
此外,非捕获组中的所有内容都是可选的,这意味着在组1中您将看不到任何内容。在开放式正则表达式上,至少应有1个必需项。(?:(\d+\t?)+
Regex 1'Identifiers:\s([\d\t]+)
获取捕获组1,然后在组1(上一个)上全局运行这个\d+
,然后就完成了。如果你真的是指一行命令,我成功地进行了这个转置(subsref(subsref(InputString,Expression,'match'),struct('type','{}','subs',{[1]}]),'%d'))
非常感谢。我应该指定我只想通过正则表达式来查找数字。但你的回答令人难以置信。伊冯,做得好,永远不会找到这个解决方案。谢谢大家!这两个解决方案都很好,而且比我的更令人满意。非常感谢。我将选择第一个。