【问题标题】:Convert Java Pattern to Javascript Pattern将 Java 模式转换为 Javascript 模式
【发布时间】:2014-11-04 21:51:07
【问题描述】:

我有以下 java 模式。

^[ -~&&[^"'<>\\]]*$

基本上这是从空格到 ~ 字符(来自 ascii 表)的所有内容,不包括双引号、单引号、尖括号和反斜杠。

我想将其转换为 Javascript 模式,我将不胜感激。

【问题讨论】:

  • 正则表达式应该是通用的,只是它们的用法不同。您如何称呼每种语言中的这种模式?
  • @Builder_K 我很确定 JavaScript 不支持字符集的连词。
  • 那么这是否意味着我需要将模式分成两个 Javascript 测试?
  • @user3017924 不,我认为可以做到,只是看起来不同。

标签: java javascript regex


【解决方案1】:

我能想到的唯一方法是负前瞻:

var pattern = /^(?:(?!["'<>\\])[ -~])*$/;

如果与您不想要的字符之一匹配,则否定前瞻 (?!["'&lt;&gt;\\]) 将导致匹配失败。

如果你想为两种语言保持相同的模式,那么这个模式也应该在 Java 中工作。

edit — 分解:

  • 开头的^ 和结尾的$ 表示整个模式必须匹配整个 测试字符串。 (与 Java 版本相同。)
  • 外部(?: ) 分组称为“非捕获”组。用普通括号制作的普通组也可以,但是当我不需要执行捕获部分时,我正在尝试养成使用非捕获组的习惯。无论哪种方式,可能都不是问题。然而重点是我们需要将以下两个部分组合在一起,以便* 运算符可以应用(更多内容见下文)。
  • (?! ) 部分是负前瞻。这样做是告诉匹配器查看前瞻中的模式是否匹配,但这样做 没有 通过模式“前进”。这就像一个“偷看拐角处”的工具。因为它是负前瞻,所以如果模式确实匹配,那么前瞻就会失败。这可以防止模式匹配 Java 版本中排除的标点字符。
  • 在前瞻之后是 Java 版本中的“所有 7 位 ASCII 字符”模式,减去连接子句(在 JavaScript 中不起作用)。
  • 否定前瞻和“任何字符”模式的组合与* 组合在一起,这意味着匹配器应该一遍又一遍地尝试将每个字符匹配到测试字符串的末尾。

【讨论】:

  • 太棒了!谢谢一堆像魅力一样的作品。对于像我这样的 JS Regex 新手,你能解释一下它到底在做什么吗?我想我需要阅读负面展望。
  • 是的,这个解决方法是最好的。在这篇文章中也提到了rexegg.com/regex-class-operations.html#subtraction_workaround
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多