【问题标题】:Java replaceAll to javascript regexJava replaceAll 到 javascript 正则表达式
【发布时间】:2013-11-12 18:12:26
【问题描述】:

我想将一些用户输入测试从 Java 移到 javascript。该代码假设在任何位置从用户输入字符串中删除通配符。我正在尝试将以下 Java 表示法转换为 javascript,但不断出错

"Invalid regular expression: /(?<!\")~[\\d\\.]*|\\?|\\*/: Invalid group".

我几乎没有使用正则表达式的经验。任何帮助都感激不尽: JAVA:

str = str.replaceAll("(?<!\")~[\\d\\.]*|\\?|\\*","");

我失败的 javascript 版本:

input = input.replace( /(?<!\")~[\\d\\.]*|\\?|\\*/g, '');    

【问题讨论】:

  • Javascript 中没有lookbehind。
  • 有人可以确认在 JS 中 \d 也需要像在 Java 中那样写成 \\d 吗?
  • @Pshemo 编写上述文字正则表达式时,无需将 \ 转义为 \\。
  • @some 感谢您的澄清。

标签: java javascript regex


【解决方案1】:

正如 anubhava 指出的那样,问题在于 JavaScript 不支持后向断言。悲伤但真实。原始正则表达式中的后向断言是 (?&lt;!\")。具体来说,它只查找不以双引号开头的字符串。

但是,一切都没有丢失。您可以使用一些技巧来实现与后视相同的结果。在这种情况下,向后看只是为了防止波浪号之前的字符也被替换。我们可以在 JavaScript 中通过匹配字符来完成此操作,但随后将其包含在替换中:

input = input.replace( /([^"])~[\d.]*|\?|\*/g, '$1' );

请注意,对于 \?\* 的交替,将没有组,因此 $1 将评估为空字符串,因此将其包含在替换中并没有什么坏处。

注意:这不是 100% 等价于原始正则表达式。特别是,环视断言(如上面的环视断言)还可以防止输入流被消耗,这在匹配彼此相邻的事物时有时非常有用。但是,在这种情况下,我想不出这样的问题。制作一个完全等效的正则表达式会比较困难,但我相信这满足了原始正则表达式的需要。

【讨论】:

  • 这太棒了!我不知道从哪里开始。这场比赛对我来说已经足够接近了,我肯定会使用它。非常感谢!
  • 很高兴它有帮助!祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2020-03-12
相关资源
最近更新 更多