Samsung Tizen TV 上的正则表达式验证 returns false

Regex validation returns false on Samsung Tizen TV

我正在使用 JavaScript 开发 SmartTV 网络应用程序。 我想编写一个验证本地移动运营商代码的正则表达式:

op_codes = [33, 50, 63, 66, 67, 68, 73, 93, 95, 96, 97, 98, 99]

我的代码在 Chrome 和 LG webOS 中正常工作。但是在 Samsung Tizen 中 RegExp.test returns false 即使它应该是 true。

代码示例:

var val = '0985739341',
    op_codes = [33, 50, 63, 66, 67, 68, 73, 93, 95, 96, 97, 98, 99],
    pattern = new RegExp('^0'+'('+op_codes.join('|')+')'+'\d{7}$');

console.log(pattern.test(val)); //Samsung Tizen output: false

这里是Tizen控制台的截图:

Tizen console(Updated)

我无法弄清楚我的代码有什么问题,我该如何解决?

在 Chrome 和 Tizen 上执行相同的代码:
Tizen(left) Chrome(right) console

相同变量 Chrome 和 Tizen:

How it can be?

新答案

您的最新屏幕截图 (here) 告诉我们您在 val 中有一个隐形角色。我真的,真的,真的应该早点想到这一点。显然,无论出于何种原因,无论 val 的来源是什么,它都包含一个不可见的字符。

您需要识别它,理想情况下,找出它的来源并修复它;否则,将其剥离。

要弄清楚它是什么,试试这个:

console.log("val", val);
Array.prototype.forEach.call(val, function(ch) {
    console.log(ch.charCodeAt(0).toString(16));
});

如果它是看起来的价值,你会得到

val 0985739341
30 39 38 35 37 33 39 33 34 31

实时复制:

var val = "0985739341";
console.log("val", val);
console.log(Array.prototype.map.call(val, function(ch) {
    return ch.charCodeAt(0).toString(16);
}).join(" "));

...但我敢打赌你会得到别的东西。它可以是几个不可见字符中的任何一个——零宽度 space (U+200B), a zero-width non-joiner (U+200C) 等。这是一个包含这两个字符的示例:

var val = "0985\u200C\u200B739341";
console.log("val", val);
console.log(Array.prototype.map.call(val, function(ch) {
    return ch.charCodeAt(0).toString(16);
}).join(" "));

一旦你知道它是什么,你就可以找出它的来源并将其删除(或之后将其从字符串中删除)。

旧的,可能不正确的答案

I can't figure out what is wrong with my code...

如果该屏幕截图是真实的,那么您的代码没有任何问题;该设备上使用的 JavaScript 引擎存在错误。这似乎是规则 "select isn't broken" 失败的罕见情况之一。 (会不会看起来是,保持怀疑并不断仔细检查自己。)

您必须尝试查看 哪里 它失败了(并提交适当的错误报告)并解决它。例如,也许 test 的实现错误地忽略了捕获组,因此没有正确应用 |,或者 new RegExp 只是从根本上被破坏了,或者......这将花费很多时间实验来弄清楚。

以下是您的原始验证 (validate1) 和您可能会尝试的三个备选方案。第二个 (validate2) 使用非捕获组而不是捕获组。就 test 而言,它们 应该 相同,但是话又说回来,您的原始代码应该可以工作。 :-)

var val = '0985739341';
var op_codes = [33, 50, 63, 66, 67, 68, 73, 93, 95, 96, 97, 98, 99];
var val1PatternStr = '^0'+'('+op_codes.join('|')+')'+'\d{7}$';
var val1Pattern = new RegExp(val1PatternStr);
var val2PatternStr = '^0'+'(?:'+op_codes.join('|')+')'+'\d{7}$';
var val2Pattern = new RegExp(val2PatternStr);

console.log(1, validate1(val));
console.log(2, validate2(val));
console.log(3, validate3(val));
console.log(4, validate4(val));
    
function validate1(val) {
    return val1Pattern.test(val);
}

function validate2(val) {
    return val2Pattern.test(val);
}

function validate3(val) {
    return val.length === 10 &&
           val[0] == "0" &&
           op_codes.indexOf(+val.substring(1,3)) != -1 &&
           /^\d+$/.test(val.substring(3));
}

function validate4(val) {
    return val.length === 10 &&
           val[0] == "0" &&
           op_codes.indexOf(+val.substring(1,3)) != -1 &&
           sillyIsDigit(val[3]) &&
           sillyIsDigit(val[4]) &&
           sillyIsDigit(val[5]) &&
           sillyIsDigit(val[6]) &&
           sillyIsDigit(val[7]) &&
           sillyIsDigit(val[8]) &&
           sillyIsDigit(val[9]);
}

function sillyIsDigit(ch) {
    return ch >= "0" && ch <= "9";
}

如果 JavaScript 引擎在 val[0] 上阻塞,您必须将 val 上的所有 [] 改为调用 charAt : val[0] => val.charAt(0).