[英]Regex conversion from java to php
我在php中有一个正则表达式,我需要将其转换为java。 有可能这样做吗? 如果可以,我该怎么办?
提前致谢
$region_pattern = "/<a href=\"#\"><img src=\"images\/ponto_[^\.]+\.gif\"[^>]*>[ ]*<strong>(?P<neighborhood>[^\(<]+)\((?P<region>[^\)]+)\)<\/strong><\/a>/i" ;
从任何正则表达式到Java的典型转换是:
/
i
。 您应该将其放在Pattern对象的初始化中,或将其添加到正则表达式前,例如(?i)<regex>
\\\\
替换所有\\
, \\
在java中已经有含义(在字符串中转义),要在Java的正则表达式中使用反斜杠,必须使用\\\\
代替\\
,因此\\w
变为\\\\w
。 而\\\\
变成\\\\\\\\
正则表达式以上将成为
Pattern.compile("<a href=\"#\"><img src=\"images\\/ponto_[^\\.]+\\.gif\"[^>]*>[ ]*<strong>(?P<neighborhood>[^\\(<]+)\\((?P<region>[^\\)]+)\\)<\\/strong><\\/a>", Pattern.CASE_INSENSITIVE);
但是,这将失败,我认为这是因为?P
是修饰符,Java中不存在一个修饰符,所以它是无效的正则表达式。
原始正则表达式存在一些必须首先解决的问题。 首先,有[ ]
,它与字符&
, n
, b
, s
, p
或;
中的一个匹配;
。 要匹配实际的不间断空格字符,应使用\\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上使用。 您确实需要进行一些调整,因为两种语言使用的模式都不完全相同(尽管模式本身可以同时在两种语言中使用)。
Pattern
对象将应用标志,而不必在模式字符串本身上指定标志。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.