我正在尝试使用MATLAB的regexp尝试过滤出较大的ASCII数据文件。通常,文件包含用逗号分隔的条目,这些条目具有大约15个字段:
$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b
但有时我的行看起来像:
$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25
我要拒绝的。我想出了一个简单的检查方法-如果匹配的文本中有14个逗号,请保留它。如果少于,则拒绝。我可以使用动态正则表达式执行此操作吗?如果是这样,怎么办?我尝试使用
(?(?@count($1,",")==14)(?<=PINS2)[-,.\s0-9]*(?=*))
作为表达式,但不起作用。
谢谢!
答案 0 :(得分:1)
您可以使用以下表达式:
^(?=(?:[^,]+,){14}).*$
^
字符串的开头。(?=
正向前进。(?:[^,]+,){14}
非捕获组。匹配任何非逗号的内容,后跟一个逗号。非捕获组匹配14次。 )
提前关闭。.*
贪婪地匹配任何东西。$
声明字符串的位置结尾。正则表达式演示here。
MATLAB 演示:
第一个字符串:
>> str = '$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'
>> regexp(str,'^(?=(?:[^,]+,){14}).*$','match')
ans =
1×1 cell array
{'$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'}
第二个字符串:
>> str = '$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25'
>> regexp(str,'^(?=(?:[^,]+,){14}).*$','match')
ans =
0×0 empty cell array
或者,您可以简单地检查字符串中有多少逗号并进行相应过滤:
>> str = '$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'
>> nnz(str == ',')
ans =
14
答案 1 :(得分:0)
您似乎可以提出正则表达式解决方案,但我建议您跳过正则表达式。
function profFunc()
n = 10;
str = repmat("$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b",100000,1);
str(50) = "$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25";
str = join(str,newline);
tic
for i = 1:n
result_1 = regexp(str,'(?<=PINS2,)(?=(?:[^,\n]+,){13})[^\n]*(?=*)','match');
end
toc
tic
for i = 1:n
result_2 = splitlines(str);
result_2(count(result_2,',') ~= 14) = [];
end
toc
end
>> profFunc
Elapsed time is 7.321635 seconds.
Elapsed time is 0.716751 seconds.
使用的正则表达式会删除“ $ PINS2”和“ * 2b”,如果需要,可以使用extractBefore和extractAfter实现。