Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于嵌套组和捕获令牌的Matlab Regexp_Regex_Matlab_Token_Regex Group - Fatal编程技术网

用于嵌套组和捕获令牌的Matlab Regexp

用于嵌套组和捕获令牌的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是一个大字符数组的一部分,该数组在该行之前和之后各有一行,由\

在Matlab正则表达式中,有没有一种方法可以在未捕获的组中捕获令牌?具体问题如下:

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 5
4
此外,非捕获组中的所有内容都是可选的,这意味着在组1中您将看不到任何内容。在开放式正则表达式上,至少应有1个必需项。
(?:(\d+\t?)+
Regex 1
'Identifiers:\s([\d\t]+)
获取捕获组1,然后在组1(上一个)上全局运行这个
\d+
,然后就完成了。如果你真的是指一行命令,我成功地进行了这个
转置(subsref(subsref(InputString,Expression,'match'),struct('type','{}','subs',{[1]}]),'%d'))
非常感谢。我应该指定我只想通过正则表达式来查找数字。但你的回答令人难以置信。伊冯,做得好,永远不会找到这个解决方案。谢谢大家!这两个解决方案都很好,而且比我的更令人满意。非常感谢。我将选择第一个。