不需要的正则表达式捕获

时间:2016-03-15 15:21:37

标签: c++ regex

以下正则表达式应该与YYYY-MM-DD形式的日期相匹配,夹在两个非字母数字字符之间。它应该只提取日期而不是两个非alphanum字符...但它恰恰相反。我究竟做错了什么。 PS我已经尝试在非捕获组(?:)中围绕[^:alnum:],但它没有用。

N = 20;
M = 30;
Dx = 1/N;
Dy = 1/M;

[Y,X] = meshgrid((1:(M))./(M+1),(1:(N))/(N+1));

% Example solution and mixed derivative (chosen for 0 BCs)
U_mat = sin(2*pi*X).*(sin(2*pi*Y.^2));
U_xy = 8*pi^2*Y.*cos(2*pi*X).*cos(2*pi*Y.^2);

% Centred finite difference matrices
delta_x_N = 1/(2*Dx)*(diag(ones(N-1,1),1) - diag(ones(N-1,1),-1));
delta_y_M = 1/(2*Dy)*(diag(ones(M-1,1),1) - diag(ones(M-1,1),-1));

% Cast U as a vector
U_vec = U_mat(:);

% Mixed derivative operator
A = kron(delta_y_M,delta_x_N);

U_xy_num = A*U_vec;
U_xy_matrix = reshape(U_xy_num,N,M);

subplot(1,2,1)
contourf(X,Y,U_xy_matrix)
colorbar
title 'Numeric U_{xy}'
subplot(1,2,2)
contourf(X,Y,U_xy)
colorbar
title 'Analytic U_{xy}'

你也可以去这个网站试试我的正则表达式,而不必为它写出c +代码。 如果您选择使用该网站,请复制并粘贴非POSIX括号表达式(不带引号):

regex online tester

regex exp1("[^:alnum:]([1-9][0-9]{3}(?:-[0-9][1-9]){2})[^:alnum:]")
//or
regex exp1("[^a-zA-Z0-9]([1-9][0-9]{3}(?:-[0-9][1-9]){2})[^a-zA-Z0-9]")

2 个答案:

答案 0 :(得分:1)

尝试简化regexp:

[^0-9]([0-9]{4}-[0-9]{2}-[0-9]{2})[^0-9]

它查找非数字,然后是YYYY-MM-DD日期,然后是非数字。它捕获日期。几乎适用于所有regexp口味。

答案 1 :(得分:0)

在你提供的正则表达式中,整体正则表达式(也称为0组)将包含两个非alphanum字符,但捕获组1应该只包含您感兴趣的日期。所以,你可以按原样使用你的正则表达式,然后从第1组中提取信息。

如果你真的想要改变你的正则表达式而不包括非alphanum字符,你需要考虑使用"积极的lookbehind断言"对于第一组和一个"积极的先行断言"为最后一组。这些断言虽然看起来像其他群体,但实际上并不包含他们在结果中匹配的内容。