如果发生条件,则MATLAB regexp拒绝匹配

时间:2018-09-06 16:49:51

标签: regex matlab

我正在尝试使用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]*(?=*))

作为表达式,但不起作用。

谢谢!

2 个答案:

答案 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实现。