我有一个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]+
的东西似乎起作用了,但是它应该以某种方式在下次出现时终止,我不知道该怎么办。
谢谢
答案 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
的任意数量的非V
或ARIBALE
:
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中使用这两种模式时无需使用任何其他标志。)