正则表达式计算'?'的实例在引号中

时间:2012-08-11 19:30:42

标签: php javascript

我正在尝试制作一个可以计算引号内的每个问号的正则表达式。这个正则表达式正在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.但这似乎很容易解决。

1 个答案:

答案 0 :(得分:0)

所以我只是尝试了它,显然显示1的原因是,因为test不是作为String处理,而是作为数组处理。所以我会替换

test = test ? test.length : 0;

通过

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

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

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

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