在/,(([1-9] - [1-9])|([1-9]))/ g中否定

时间:2011-10-29 08:16:35

标签: javascript regex

我正在尝试匹配包含数字和带连字符的数字组合的字符串,例如填字游戏答案规范,例如1,2-21-1,3,4,2-2

/,?(([1-9]-[1-9])|([1-9]))/g是我提出来匹配字符串

value = value.replace(/,?(([1-9]-[1-9])|([1-9]))/g, '');

替换好了,我已经在在线测试仪上检查了它。

我真正需要的是否定这一点,所以我可以在keyup事件中使用它,检查textarea的内容并删除不适合的字符,因此它只允许通过字符,例如示例。

我已经尝试了^预期,但这不是我所期望的,我应该如何否定正则表达式,以便删除所有不匹配的内容?

如果有更好的方法,我也愿意接受建议。

2 个答案:

答案 0 :(得分:1)

var value = 'hello,1,2,3,4-6,1-1,3,test,4,2-2';
var pattern = /,?(([1-9]-[1-9])|([1-9]))/g;

value.replace(pattern, ''); // "hello,test"

您可以使用String#match。使用/g标志,它会返回所有匹配项的数组,然后您可以使用Array#join加入它们。

问题是String#match在没有匹配时返回null,所以你必须处理这种情况并使用一个空数组才能加入:

(value.match(pattern) || []).join(''); // ",1,2,3,4-6,1-1,3,4,2-2"

注意:最好在onblur而不是onkeyup上查看它们。弄乱用户当前正在键入的文本将使其烦人。最好等待用户完成输入。

答案 1 :(得分:1)

没有在JS中测试它,但是这应该从左边开始返回有效字符串并且只要遇到有效值(注意我使用了\d - 如果你只想要1-9 ,然后使用括号)。

(?:\d(?:-\d)?,)*\d(?:-\d)?

E.g。将此正则表达式与字符串"0-1,1,2,3,4-4,2,,1,3--4"匹配将返回"0-1,1,2,3,4-4,2"作为第一个匹配。