正则表达式从java转换为php

时间:2011-11-04 21:28:04

标签: java php regex

我在php中有一个正则表达式,我需要将它转换为java。 有可能这样做吗?如果是,我该怎么办?

提前致谢

$region_pattern = "/<a href=\"#\"><img src=\"images\/ponto_[^\.]+\.gif\"[^>]*>[&nbsp;]*<strong>(?P<neighborhood>[^\(<]+)\((?P<region>[^\)]+)\)<\/strong><\/a>/i" ;

3 个答案:

答案 0 :(得分:4)

从任何正则表达式到java的典型转换是:

  • 排除模式分隔符=&gt;删除开始和结尾/
  • 删除标记,这些标记应用于Pattern对象,这是尾随i。您应该将它放在Pattern对象的初始化中,或者将其添加到正则表达式(?i)<regex>
  • 将所有\替换为\\\已经在java中有意义(在字符串中转义),要在java中使用正则表达式中的反斜杠,您必须使用{{1}而不是\\,因此\变为\w。并\\w变为\\

以上正则表达式将成为

\\\\

然而,这会失败,我认为这是因为Pattern.compile("<a href=\"#\"><img src=\"images\\/ponto_[^\\.]+\\.gif\"[^>]*>[&nbsp;]*<strong>(?P<neighborhood>[^\\(<]+)\\((?P<region>[^\\)]+)\\)<\\/strong><\\/a>", Pattern.CASE_INSENSITIVE); 是一个修饰语,而不是我所知道的存在于Java中所以它是一个无效的正则表达式。

答案 1 :(得分:3)

原始正则表达式存在一些问题,必须首先清除。首先,[&nbsp;]匹配其中一个字符&nbsp; 。要匹配实际的不间断空格字符,您应使用\xA0

你还有很多不需要的反斜杠。您可以通过将正则表达式分隔符更改为/之外的其他内容来删除某些内容;其他人不需要,因为他们在角色类中,大多数元字符失去了他们的特殊含义。这留下了这个PHP正则表达式:

"~<a href=\"#\"><img src=\"images/ponto_[^.]+\.gif\"[^>]*>\xA0*<strong>(?P<neighborhood>[^(<]+)\((?P<region>[^)]+)\)</strong></a>~i"

有三件事使这个正则表达式与Java不兼容。一个是分隔符(最初为/,上述版本为~)以及尾随i修饰符。 Java根本不使用正则表达式分隔符,所以只需删除它们。通过在正则表达式的开头使用内联形式(?i),可以将修饰符移动到正则表达式中。 (顺便说一下,这也适用于PHP。)

接下来是反斜杠。用于转义引号的那些保持不变,但所有其他引号都加倍,因为Java对字符串文字中的转义序列更严格。

最后,还有命名组。直到Java 6,根本不支持命名组; Java 7支持它们,但它们使用.NET所支持的较短(?<name>...)语法, 不是Pythonesque (?P<name>...)语法。 (顺便说一句,较短的(?<name>...)版本也应该在PHP中工作(也应该由.NET引入(?'name'...))。

所以你的正则表达式的Java 7版本将是:

"(?i)<a href=\"#\"><img src=\"images/ponto_[^.]+\\.gif\"[^>]*>\\xA0*<strong>(?<neighborhood>[^(<]+)\\((?<region>[^)]+)\\)</strong></a>"

对于Java 6或更早版本,您将使用:

"(?i)<a href=\"#\"><img src=\"images/ponto_[^.]+\\.gif\"[^>]*>\\xA0*<strong>([^(<]+)\\(([^)]+)\\)</strong></a>"

...你必须使用数字而不是名字来引用群组捕获。

答案 2 :(得分:0)

无论语言如何,REGEX都是REGEX。您发布的REGEX将适用于Java和PHP。你需要做一些调整,因为两种语言都没有完全相同的模式(虽然模式本身可以在两种语言中工作)。

要考虑的要点

  • 您应该知道Java的Pattern对象应用标志而不必在模式字符串本身上指定它们。
  • 也不应包括分隔符。只有模式本身。