我在php中有一个正则表达式,我需要将它转换为java。 有可能这样做吗?如果是,我该怎么办?
提前致谢
$region_pattern = "/<a href=\"#\"><img src=\"images\/ponto_[^\.]+\.gif\"[^>]*>[ ]*<strong>(?P<neighborhood>[^\(<]+)\((?P<region>[^\)]+)\)<\/strong><\/a>/i" ;
答案 0 :(得分:4)
从任何正则表达式到java的典型转换是:
/
i
。您应该将它放在Pattern对象的初始化中,或者将其添加到正则表达式(?i)<regex>
\
替换为\\
,\
已经在java中有意义(在字符串中转义),要在java中使用正则表达式中的反斜杠,您必须使用{{1}而不是\\
,因此\
变为\w
。并\\w
变为\\
以上正则表达式将成为
\\\\
然而,这会失败,我认为这是因为Pattern.compile("<a href=\"#\"><img src=\"images\\/ponto_[^\\.]+\\.gif\"[^>]*>[ ]*<strong>(?P<neighborhood>[^\\(<]+)\\((?P<region>[^\\)]+)\\)<\\/strong><\\/a>", Pattern.CASE_INSENSITIVE);
是一个修饰语,而不是我所知道的存在于Java中所以它是一个无效的正则表达式。
答案 1 :(得分:3)
原始正则表达式存在一些问题,必须首先清除。首先,[ ]
匹配其中一个字符&
,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中工作(也应该由.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。你需要做一些调整,因为两种语言都没有完全相同的模式(虽然模式本身可以在两种语言中工作)。
Pattern
对象应用标志而不必在模式字符串本身上指定它们。