我有一个字符串,我想使用正则表达式提取字符:
和另一个字符/
之间的字符组。
通常,这是我得到的一个字符串示例:
'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'
因此,我想要检索45.72643,4.91203
以及hereanotherdata
因为它们位于字符:
和/
之间。
我在一个更简单的字符串中尝试使用这种语法,其中只有一次模式,
[tt]=regexp(str,':(\w.*)/','match')
tt = ':45.72643,4.91203/'
但只有在模式发生一次时它才有效。如果我在包含模式的倍数的字符串中使用它,我会得到第一个:
和最后一个/
之间的所有字符串。
我怎么能提到模式会多次出现,我该如何检索呢?
答案 0 :(得分:2)
regexp(str, '(?<=:).+?(?=/)', 'match')
示例(Matlab R2016b):
>> str = 'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh';
>> result = regexp(str, '(?<=:).+?(?=/)', 'match')
result =
1×2 cell array
'45.72643,4.91203' 'hereanotherdata'
答案 1 :(得分:1)
在大多数语言中,单个正则表达式很难做到这一点。最终你只会得到一个字符串,并且你想要找回多个字符串。
我从未使用过Matlab,因此可能会使用该语言,但基于其他语言,这就是我接近它的方式......
我不能给你确切的代码,但搜索表明在Matlab中有一个名为strsplit的函数,例如......
C = strsplit(data,':')
这应该会将原始字符串分解为字符串数组,使用“:”作为断点。然后,您可以忽略第一个数组索引(因为它包含“:”之前的文本),循环数组的其余部分和regexp以提取“/".
之前的所有内容。所以......例如......
'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'
分解成带有零件的数组......
1 - 'abcd'
2 - '45.72643,4.91203/Rou'
3 - 'hereanotherdata/defgh'
然后忽略1,并在2和3中的“/”之前提取所有内容。
答案 2 :(得分:0)
John Mawer和Adriaan提到,strsplit
是一个很好的开始。您可以将它用于&#39;:&#39;和&#39; /&#39;,但是你将无法确定每个人的起点。如果您使用strsplit
两次,则可以知道&#39;:&#39;开始:
A='abcd:45.72643,4.91203/Rou:hereanotherdata/defgh';
B=cellfun(@(x) strsplit(x,'/'),strsplit(A,':'),'uniformoutput',0);
现在B的单元格以&#39;:&#39;开头,每个单元格中有两个单元格包含&#39; /&#39;也。你可以通过检查B有多个单元格的位置来提取它,并取出每个单元格中的第一个:
C=cellfun(@(x) x{1},B(cellfun('length',B)>1),'uniformoutput',0)
C =
1×2 cell array
'45.72643,4.91203' 'hereanotherdata'
答案 3 :(得分:0)
从16b开始,您可以使用extractBetween:
>> str = 'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh';
>> result = extractBetween(str,':','/')
result =
2×1 cell array
{'45.72643,4.91203'}
{'hereanotherdata' }
如果所有文本元素具有相同数量的分隔符,则也可以对其进行矢量化。