如何将 javascript 正则表达式转换为安全的 Java 正则表达式?

Posted

技术标签:

【中文标题】如何将 javascript 正则表达式转换为安全的 Java 正则表达式?【英文标题】:How to convert javascript regex to safe java regex? 【发布时间】:2011-06-14 21:01:54 【问题描述】:
strOutput.replace("/[^]*?/g","");

有没有办法将 javascript 正则表达式转换为 Java 安全的正则表达式?

上面的语句给了我错误:

Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )

我对正则表达式不是很熟悉,所以我可以使用一些指导。

谢谢!

【问题讨论】:

您可以发布您创建的导致错误的 Java 吗? 【参考方案1】:

去掉正斜杠。你不需要Java中的那些。此外,Java 的正则表达式不能识别像 /g/i 这样的开关;这些由java.util.regex.Pattern 中的常量控制。

在 Java 世界中唯一有意义的 Javascript 正则表达式开关是 /i/m。这些映射到Pattern.CASE_INSENSITIVEPattern.MULTILINE(您可以在从Pattern 类创建正则表达式时使用这些开关,或者您可以内联使用它们——我稍后会展示)。

/g 不映射到任何内容,但您可以通过使用 String.replaceAllString.replaceFirst 来控制替换行为。

要让您的代码正常工作,您必须执行以下操作:

strOutput.replaceAll("[^]*?", "");

如果您想使用开关,您需要在正则表达式的开头添加类似(?i) 的内容。

您不能使用String.replace,因为它的第一个参数是CharSequence,而不是正则表达式。

还请记住,String 类提供的“快速正则表达式”方法可能无法像您期望的那样工作。这是因为当您指定一个模式(比如abc)作为matches 的正则表达式时,Java 看到的实际模式是^abc$。所以abc 会匹配,但abcd 不会。

还有更多信息here。

【讨论】:

【参考方案2】:

去掉正则表达式开头和结尾的"/""/g"。然后你需要像这样逃避每一个"\""\\"

“g”部分表示全局。这由您在 Java 中使用正则表达式的方式控制,而不是在正则表达式字符串中。

【讨论】:

【参考方案3】:

您不需要 /(开始和结束处的正斜杠)在 javascript 中用于内联声明而不是引号。

应该只是Regex r = new Regex("[^]*?"); ​​​​

【讨论】:

以上是关于如何将 javascript 正则表达式转换为安全的 Java 正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

将 c# 正则表达式转换为 javascript 正则表达式

将 po box javascript 正则表达式转换为 c# 正则表达式

正则表达式 - 将 C# 正则表达式转换为 JavaScript 正则表达式的量词的目标无效

将 Javascript 正则表达式转换为 PHP

将 Javascript 正则表达式转换为 Java 语法

如何将 DFA 转换为正则表达式?