正则表达式在子字符串之间分割文件

时间:2018-08-20 08:20:02

标签: regex matlab split substring

我有一个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]+的东西似乎起作用了,但是它应该以某种方式在下次出现时终止,我不知道该怎么办。 谢谢

1 个答案:

答案 0 :(得分:4)

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

分割是一种更简单的方法,因为模式看起来像(?!^)(?=VARIABLE),但有一个警告:Matlab regex期望默认为非空匹配(默认为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,然后匹配不跟V的任意数量的非VARIBALE

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

请参见regex demo

详细信息

  • VARIABLE-一个VARIABLE子字符串
  • [^V]*-与V之外的0个或更多字符匹配的否定字符类
  • (?:V(?!ARIABLE)[^V]*)*-零次或更多次连续出现
    • V-一个V字符
    • (?!ARIABLE)-...后面没有ARIABLE
    • [^V]*-除V以外的0个或更多字符。

请注意,它在词法上与VARIABLE(?:(?!VARIABLE).)*(带有tempered greedy token)或VARIABLE.*?(?=VARIABLE|$)(带有惰性点模式和仅正向超前)相同,但效率更高遵循unroll the loop principle。 (请注意,Matlab正则表达式中的.匹配包括换行符在内的任何字符,因此在Matlab中使用这两种模式时无需使用任何其他标志。)