首页 > 解决方案 > 子字符串之间的正则表达式拆分文件

问题描述

我有一个 CSV 文件,其中包含来自多个变量的数据,我想将它们分开。我的文件如下所示:

VARIABLE: GRP1.SGRP1.100:VAR1

Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
VARIABLE: GRP1.SGRP2.102:VAR1

Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048

我想在每次出现子字符串“VARIABLE”时将其拆分,生成两个字符串:

VARIABLE: GRP1.SGRP1.100:VAR1

Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048

VARIABLE: GRP1.SGRP2.102:VAR1

Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048

类似的东西VARIABLE[^V]+似乎可以工作,但它应该以某种方式在下一次发生时终止,我不知道如何。谢谢

标签: regexmatlabsplitsubstring

解决方案


您可以使用两种方法,匹配和拆分。

拆分是一种更简单的方法,因为模式看起来像(?!^)(?=VARIABLE),但有一个警告:Matlab 正则表达式默认情况下需要非空匹配项(noemptymatch选项是默认值)。您需要传递emptymatch选项以regexp使其正常工作:

splitStr = regexp(str,'\s*(?!^)(?=VARIABLE)','split', 'emptymatch')

输出:

splitStr = 
{
  [1,1] = VARIABLE: GRP1.SGRP1.100:VAR1

Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048

  [1,2] = VARIABLE: GRP1.SGRP2.102:VAR1


Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
}

(?!^)(?=VARIABLE)模式匹配字符串中不在字符串开头但紧随其后的VARIABLE子字符串的任何位置。

或者,您可以匹配VARIABLE,然后匹配任意数量的非Vs 或V不跟随s 的 s ARIBALE

matchStr = regexp(str,'VARIABLE[^V]*(?:V(?!ARIABLE)[^V]*)*','match')

请参阅正则表达式演示

细节

  • VARIABLE- 一个VARIABLE子串
  • [^V]*- 一个否定字符类,匹配 0 个或多个其他字符V
  • (?:V(?!ARIABLE)[^V]*)*- 零次或多次连续出现
    • V- 一个V字符是
    • (?!ARIABLE)- ... 不跟随ARIABLE
    • [^V]*- 0 个或更多字符,而不是V.

请注意,它在“词法上”与VARIABLE(?:(?!VARIABLE).)*(使用缓和的贪婪标记)或VARIABLE.*?(?=VARIABLE|$)(使用惰性点模式和仅正向前瞻)相同,但更有效,因为它遵循展开循环原则。(请注意,.在 Matlab 中,正则表达式匹配任何字符,包括换行符,因此在 Matlab 中使用这两种模式时无需使用任何其他标志)。


推荐阅读