1

我正在尝试制作一个正则表达式来计算引号内的每个问号。这个正则表达式正在 javascript 中进行测试,但如果这很重要,我打算将它用于 PHP。我有一些这样的作品,但还不够好。

这里是。

/(\"|\')(([^\"\'\\]|\\.)*)\?(([^\"\'\\]|\\.)*(\"|\'))/g

正如您可能看到的,我也想忽略转义引号。

说我有字符串"hello? \"world?\""。这将返回正确的 1。

但至于这个"hello? \"world??\""。这也将返回 1,但我想要的是 2。我怎样才能做到这一点?

如果我能得到一个与此完全相反的正则表达式(计算不在引号中的问号),我也会非常喜欢。

如果有帮助,这是用于此测试的整个函数。

function countTest(str) {
    regx = /(\"|\')(([^\"\'\\]|\\.)*)\?(([^\"\'\\]|\\.)*(\"|\'))/g;

    test = str.match(regx);
    test = test ? test.length : 0;

    console.log(test);
}

编辑:

还!我从我自己在这个问题中的拼写错误中注意到,字符串hello \"world?\'"也将返回 1。不过,这似乎很容易解决。

4

1 回答 1

0

所以我只是尝试了一下,显然显示 1 的原因是,因为 test 不被视为字符串,而是被视为数组。所以我会替换

test = test ? test.length : 0;

经过

test = test ? new String(test).length - 3 * test.length + 1: 0;

换句话说,您从数组的 String 值中减去 3 个字符“,”,但添加 1,因为第一个数组元素没有逗号字符。

编辑:对于引号外的计数问号,只需从字符串中的总问号数中减去上面给出的数字即可。

编辑:对于 PHP,您可能会使用 array_slice 函数而不是 new String(test),并根据需要调整乘法和加法常量。

于 2012-11-03T20:50:43.230 回答