使用正则表达式查找字符开头和结尾的字符串组

时间:2017-09-14 09:40:38

标签: regex string matlab

我有一个字符串,我想使用正则表达式提取字符:和另一个字符/之间的字符组。 通常,这是我得到的一个字符串示例:

'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'

因此,我想要检索45.72643,4.91203以及hereanotherdata 因为它们位于字符:/之间。

我在一个更简单的字符串中尝试使用这种语法,其中只有一次模式,

[tt]=regexp(str,':(\w.*)/','match')

tt =    ':45.72643,4.91203/'

但只有在模式发生一次时它才有效。如果我在包含模式的倍数的字符串中使用它,我会得到第一个:和最后一个/之间的所有字符串。

我怎么能提到模式会多次出现,我该如何检索呢?

4 个答案:

答案 0 :(得分:2)

使用lookaroundlazy quantifier

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' }

如果所有文本元素具有相同数量的分隔符,则也可以对其进行矢量化。