如何访问数据的regexp输出(没有临时变量)?

26日视图(30天)
我知道如何regexp()的输出转换为一个表通过一个临时变量的媒介解决方案:
开始于= [“苹果001”;102“香蕉”;“橙色344 001”];
C = regexp(开始于' \ s ',“分裂”,“一次”);%临时变量
array2table (vertcat (C {:,:}))%期望输出值,除了希望避免括号的方法。
ans =3×2表
Var1 Var2 ________ _____“苹果”“001”“102”“香蕉”“橙色”“344年001”
我想知道如果有一种方法可以级联/管道函数调用在一行。看来,类似的问题问无数次( 这篇文章是这样说 )。但我想了解更多关于Matlab,所以原谅我问一遍。
%我尝试了这一点,但它不给期望的结果。
cell2table(正则表达式(开始于,' \ s ',“分裂”,“一次”))
ans =3×1表
Var1 _____________________“苹果”“001”“102”“香蕉”“橙色”“344年001”

接受的答案

Stephen23
Stephen23 2023年4月26日
编辑:Stephen23 2023年4月26日
一般的答案自2012年以来一直没有什么变化。
使用临时变量并不是像许多初学者想象的“低效率”(最有可能的MATLAB将生成中间细胞内部数组)。
str = [“苹果001”;102“香蕉”;“橙色344 001”];
台= splitvars (cell2table(正则表达式(str,' \ s ',“分裂”,“一次”)))
台=3×2表
Var1_1 Var1_2 ________ _____“苹果”“001”“102”“香蕉”“橙色”“344年001”
注意,这个创建并丢弃一个中间表,所以使用更多的内存。
我个人推荐使用中间变量:当代码高尔夫是非常有趣的,它不提供清晰和效率的目的。在一年内你会回到这段代码任何想知道它,它是如何工作的,它有什么副作用。阅读更多倍比写代码,所以清晰阅读时是有价值的。
除此之外,隐藏中间数组内嵌套的函数调用使调试更加困难。
1评论
西蒙
西蒙 2023年4月26日
有几个建议良好的编码习惯你的答案。再次感谢。(我逐渐意识到,自在,我学会了从Python编码结果不太好,oneliner功能。)

登录置评。

更多的答案(3)

albara
albara 2023年4月26日
编辑:每•艾萨克森 2023年4月26日
您可以访问的数据 正则表达式 直接输出不使用临时变量使用语法 [~,~,~,配]= regexp (str, expr) ,在那里 str 输入字符串和吗 expr 是你想匹配的正则表达式。
正则表达式 函数返回多个输出,包括比赛的开始和结束索引,任何令牌被正则表达式匹配的子串。通过使用 ~ 象征作为一个占位符输出你不需要,你可以忽略它们,只有保持匹配的子串。
这是一个例子:
%定义输入字符串和正则表达式
str =“那只敏捷的棕色狐狸跳过了懒惰的狗的;
expr =“棕色”;
%使用正则表达式查找匹配的子串和直接访问它
[~,~,~,配]= regexp (str, expr);
%显示匹配的子串
disp(匹配)
在这个例子中, 正则表达式 用于查找这个词的第一次出现在输入字符串“棕色” str 。的 ~ 象征作为一个占位符的输出我们不需要,和 匹配 变量是用来存储直接匹配的子串。
这段代码将字符串的输出 “棕色” 。注意,您可以访问其他任何输出 正则表达式 通过使用相应的占位符变量,如 (开始、结束标记,匹配)= regexp (str, expr) 存储开始和结束指数和分离变量的任何标记。
3评论
Stephen23
Stephen23 2023年5月13日在12日
“为什么我们有不同的结果相同的编码吗?”
元字符\ S只在正则表达式匹配非空字符:
“橙色”“344年001”
% ^所以没有方法可以返回

登录置评。


里克
里克 2023年4月26日
如果你坚持一行,您甚至可以使用 subsref 指数的结果 正则表达式 。这将使您的代码难以阅读,很难修改。
你为什么不写一个包装器函数可以调用 regexp2table 是这样的:
开始于= [“苹果001”;102“香蕉”;“橙色344 001”];
regexp2table(开始于' \ s ',“分裂”,“一次”)%看,妈,一行
ans =3×2表
Var1 Var2 ________ _____“苹果”“001”“102”“香蕉”“橙色”“344年001”
函数选项卡= regexp2table(变长度输入宗量)
%所有输入都输送到正则表达式()。
C = regexp(变长度输入宗量{:});
选项卡= array2table (vertcat (C {:}));
结束
1评论
西蒙
西蒙 2023年5月13日时间
谢谢。代码和它背后的想法可能会方便解决更困难的正则表达式问题。

登录置评。


Dyuman Joshi
Dyuman Joshi 2023年4月26日
试验导致——
str = [“苹果001”;“香蕉102 3579”;“橙色344 001”]
str =3×1的字符串数组
“苹果001年”“香蕉102 3579”“橙色344 001”
C = array2table ([extractBefore (str,' ')extractAfter (str,' ')))
C =3×2表
Var1 Var2 ________ __________“苹果”“001”“香蕉”“102”3579年“橙色”“344年001”
1评论
西蒙
西蒙 2023年5月13日在七51
我不知道extractBefore()或extractAfter ()。很好的解决方案。谢谢!

登录置评。

类别

找到更多的在字符和字符串帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!