繁体   English   中英

正则表达式从Java到PHP的转换

[英]Regex conversion from java to php

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

提前致谢

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

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

  • 排除模式定界符=>删除开头和结尾/
  • 删除标记,这些标记将应用于Pattern对象,即尾随的i 您应该将其放在Pattern对象的初始化中,或将其添加到正则表达式前,例如(?i)<regex>
  • \\\\替换所有\\\\在java中已经有含义(在字符串中转义),要在Java的正则表达式中使用反斜杠,必须使用\\\\代替\\ ,因此\\w变为\\\\w \\\\变成\\\\\\\\

正则表达式以上将成为

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

但是,这将失败,我认为这是因为?P是修饰符,Java中不存在一个修饰符,所以它是无效的正则表达式。

原始正则表达式存在一些必须首先解决的问题。 首先,有[&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中运行( (?'name'...) .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>"

...并且您必须使用数字而不是名称来引用组捕获。

REGEX是REGEX,与语言无关。 您发布的REGEX可以在Java和PHP上使用。 您确实需要进行一些调整,因为两种语言使用的模式都不完全相同(尽管模式本身可以同时在两种语言中使用)。

要考虑的要点

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM