【问题标题】:Find group of strings starting and ending by a character using regular expression使用正则表达式查找以字符开头和结尾的字符串组
【发布时间】:2017-09-14 09:40:37
【问题描述】:

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

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

所以,我想检索45.72643,4.91203hereanotherdata 因为它们都在字符 :/ 之间。

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

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

tt =    ':45.72643,4.91203/'

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

如何提及该模式将多次出现,以及如何检索它?

【问题讨论】:

    标签: regex string matlab


    【解决方案1】:

    使用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'
    

    【讨论】:

    • 谢谢!它似乎运作良好。我花了一些时间来解码语法,但我想我明白了。 :)
    • 正则表达式会发生这种情况:-D
    【解决方案2】:

    在大多数语言中,使用单个正则表达式很难做到这一点。最终你只会取回一个字符串,而你想取回多个字符串。

    我从未使用过 Matlab,所以用那种语言可能是可行的,但是基于其他语言,我会这样处理它...

    我不能给你确切的代码,但是搜索表明在Matlab中有一个叫做strsplit的函数,例如...

    C = strsplit(data,':')
    

    这应该会将您的原始字符串分解为一个字符串数组,使用“:”作为断点。然后,您可以忽略第一个数组索引(因为它包含“:”之前的文本),循环数组的其余部分和正则表达式以提取“/”之前的所有内容。

    比如说……

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

    用部分分解成一个数组...

    1 - 'abcd'
    2 - '45.72643,4.91203/Rou'
    3 - 'hereanotherdata/defgh'
    

    然后忽略1,将2和3中“/”之前的所有内容都提取出来。

    【讨论】:

    • 您确实可以在 MATLAB 中执行双重 strsplit
    【解决方案3】:

    正如 John Mawer 和 Adriaan 所提到的,strsplit 是一个很好的起点。您可以将它用于“:”和“/”,但是您将无法确定它们每个的开始位置。如果你用strsplit 做两次,你可以知道':' 从哪里开始:

    A='abcd:45.72643,4.91203/Rou:hereanotherdata/defgh';
    B=cellfun(@(x) strsplit(x,'/'),strsplit(A,':'),'uniformoutput',0);
    

    现在 B 有以“:”开头的单元格,并且每个单元格中有两个单元格也包含“/”。您可以通过检查 B 有多个单元格的位置来提取它,然后取每个单元格中的第一个:

    C=cellfun(@(x) x{1},B(cellfun('length',B)>1),'uniformoutput',0)
    
    C =
    
    1×2 cell array
    
        '45.72643,4.91203'    'hereanotherdata'
    

    【讨论】:

    • 是的,strsplit 是我迄今为止一直在使用的。但我认为正则表达式可能更容易做到这一点。谢谢
    【解决方案4】:

    从 16b 开始,您可以使用 extractBetween:

     >> str = 'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh';
     >> result = extractBetween(str,':','/')
    
     result =
    
       2×1 cell array
    
         {'45.72643,4.91203'}
         {'hereanotherdata' }
    

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

    【讨论】:

    • 哇我不知道这个功能!这是一个新的。很好,我在 2016b 工作。我将详细检查此功能。谢谢!
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2016-12-07
    • 2017-09-17
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多