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)
.
我正在使用 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)
.