正则表达式 - 忽略引号内的转义字符

时间:2018-02-16 15:06:37

标签: php regex nested escaping regex-lookarounds

我正在使用正则表达式多年,但这次我正在努力奋斗。

假设我有以下简单的字符串。

import numpy as np

def f(n, z, X, do_it_pps_way=True):
    X = np.asanyarray(X)
    diag = np.arange(n+1)
    a,b=np.ogrid[0:n+1:1,0:n+1:1]
    B=np.exp(1j*(np.pi/3)*np.abs(a-b))
    X = X.reshape(-1,1,1)
    if do_it_pps_way:
        zbx = np.mean(np.abs(z-b+X), axis=0)
        azx = np.mean(np.abs(a-z+X), axis=0)
    else:
        zbx = np.mean((np.abs(z-b+X)+3) % 6 - 3, axis=0)
        azx = np.mean((np.abs(a-z+X)+3) % 6 - 3, axis=0)
    B[z,b] = np.exp(1j * (np.pi/3) * zbx)
    B[a,z] = np.exp(1j * (np.pi/3) * azx)
    B[diag,diag]=1-1j/np.sqrt(3)
    return B

def geo_mean(y):
    y = np.asarray(y)
    dim = len(y.shape)
    y = np.atleast_2d(y)
    v = np.prod(y, axis=0) ** (1.0 / y.shape[0])
    return v[0] if dim == 1 else v

def geo_mean_correct(y):
    y = np.asarray(y)
    return np.prod(y ** (1.0 / y.shape[0]), axis=0)

# demo that orig geo_mean is wrong
B = np.exp(1j * np.random.random((5, 5)))
# the mean of four times the same thing should be the same thing:
if not np.allclose(B, geo_mean([B, B, B, B])):
    print('geo_mean failed')
if np.allclose(B, geo_mean_correct([B, B, B, B])):
    print('but geo_mean_correct works')

n, z, m = 10, 3, 50

X = np.random.uniform(-0.8, 0.8, (m,))
B0 = f(n, z, X, do_it_pps_way=False)
B1 = np.prod((*map(np.power, map(f, m*(n,), m*(z,), X), m * (1/m,)),), axis=0)
B2 = geo_mean_correct([f(n, z, x) for x in X])

# This is the recommended way:
B_recommended = f(n, z, X, do_it_pps_way=True)

print()
print(np.allclose(B1, B0))
print(np.allclose(B2, B1))

现在我想匹配单引号内的所有内容。甚至还有逃脱的角色。凭借我当前的正则表达式,那些逃脱的角色正在炸毁结果。

$content = "foo 'bar \' [\'],' test";

结果

$regex = "/\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'/";

现场演示HERE

2 个答案:

答案 0 :(得分:1)

你可以试试这个

'([^']|(\'))*'

Demo

甚至更精确

'([^']|(\'))*?(?<!\\)'

Demo

答案 1 :(得分:1)

你想在这里找到一个公开的报价及其结束报价,所以没有转义报价 ./Multiwfn >HF-Dr.out << EOF HF.fchk 3 21 2 2 0.043532 -0.032964 1.960094 0.043532 -0.032964 1.960094 EXIT EOF 会这样做 说明:

(?<!\\)'.*?(?<!\\)'负面看待 (?<!逃脱了反斜杠并关闭了后视 \\)尚未转义的报价(背后的负面看法检查了它)
'懒惰模式中的任何字符:.*?.*所以下一个引用将被评估为
?再次出现负面反馈,以检查报价是否已被转义 (?<!\\)最终没有转义报价