Javascript string.replace在Firefox中不工作?
我的Oracle Apex 4.2页面中有许多动态操作,在电话号码输入字段上有“执行Javascript代码”操作:Javascript string.replace在Firefox中不工作?,javascript,regex,oracle-apex,Javascript,Regex,Oracle Apex,我的Oracle Apex 4.2页面中有许多动态操作,在电话号码输入字段上有“执行Javascript代码”操作: $s("P40_MOBILE_PHONE", $v("P40_MOBILE_PHONE").replace(/[()-\s]+/g, '')); 这适用于IE和Chrome。然而,在Firefox中,它不仅不能工作,而且会导致页面上的所有其他动态操作完全停止工作 此动态操作与其他动态操作之间的唯一区别似乎是使用了string.replace(/[()-\s]+/g',)。这应该
$s("P40_MOBILE_PHONE", $v("P40_MOBILE_PHONE").replace(/[()-\s]+/g, ''));
这适用于IE和Chrome。然而,在Firefox中,它不仅不能工作,而且会导致页面上的所有其他动态操作完全停止工作
此动态操作与其他动态操作之间的唯一区别似乎是使用了
string.replace(/[()-\s]+/g',)
。这应该可以去掉电话号码中的任何空格、(
、)
和-
字符。正如@dandavis在一篇评论中所说的,对破折号进行转义是有效的(不过,不需要转义括号)
如果你试图运行代码
/[()-\s]+/
你得到
SyntaxError: invalid range in character class
这是因为Firefox试图将破折号用作范围字符,而不是破折号
要解决此问题,您可以:
- 跳出破折号:
/[()\-\s]+/
- 将破折号放在开头或结尾:
,/[-()\s]+/
/[()\s-]+/
replace(/[\(\)\-\s]+/g, '')
请尝试\(\)和\-而不仅仅是()和-@dandavis,谢谢,这就解决了问题。如果你把它作为一个答案,我会把它标记为正确的。我不认为纠正一个打字错误会对其他人有多大好处;如果你这么说的话,对污染搜索的完整回答毫无意义。从我的角度来看,这不是一个拼写错误,我真的不知道你不能在正则表达式中引用这样的单个字符-因为它在IE和Chrome中工作,我从语法正确的假设开始。谷歌搜索,所以搜索没有帮助。如果我简化这个问题,它可能会对其他人有用,你不认为吗?字符类中的括号不应该转义。正如Oriol所指出的,这确实是短跑造成的问题;你已经解释了为什么它不起作用;你给了我一个在将来诊断类似问题的提示:)…当然,作为一个“安全比抱歉更好”的措施,但是如果你理解正则表达式字符类,这是不必要的!在这个问题之前,我真的不明白有时候你必须逃避这些角色,有时候你不必。我已经习惯了在这方面更加一致的语言。正则表达式语法是编码世界中为数不多的几乎通用的东西之一。当然,每种语言都有其独特之处和局限性,但其核心语法基本相同。这不是矛盾。。只是char类允许您使用连字符指定字符范围,例如
a-Z
。因此,为了将其与文字连字符区分开来,您必须按照公认的答案进行操作。如果要使用字符类,则必须在字符类中转义的其他字符只有[]
,因为它们是字符类分隔符。同样,逃离定界符…是一件非常普遍的事情。这些是唯一需要逃避的事情,而且,这在正则表达式世界中是相当普遍的。然后那里有一个\s
,但它是用来表示空格字符的,而不是用来生成文本s。同样,诸如\s
,\n
,\t
之类的转义字符非常通用。我不是想对你发牢骚,所以如果你那样做,我向你道歉!我不是在贬义的意义上使用“不一致”这个词,只是在字面意义上。从字面上看,在正则表达式中(正如我今天学到的,是的!),未转义的-
可以表示文字-
字符,也可以表示一系列字符,具体取决于上下文。从这个意义上讲,它是不一致的——但当然它有定义良好的规则,任何正则表达式编写者都应该熟悉这些规则。