您如何将该Perl正则表达式转换为Java?
/pattern/i
你不能
造成这种情况的原因很多。这里有一些:
Java不像Perl那样支持正则表达式语言。它缺少字形支持(如
X)
和完整属性支持(如p{Sentence_Break=SContinue}),缺少Unipre命名字符,没有(?|...|...|)
分支重置运算符,x{...}在Java 7之前没有命名捕获组或逻辑转义,没有递归正则表达式等)。等等等等。我可以写一本关于Java在这里缺少的书:习惯于回到一个 非常 原始和笨拙的地方来使用regex引擎。另一个甚至更糟的问题是,因为您拥有类似and,and ,and甚至and的 人造假象 ,它们在Java中的表现与Perl不同。在某些情况下,Java版本完全无法使用且存在错误。这是因为Perl遵循UTS#18,但是在Java 7之前,Java没有。您 必须* 添加Java 7中的标志才能使它们停止被破坏。如果您不能使用Java 7,请立即放弃,因为Java在Java 7之前还有许多其他Unipre错误,因此不值得处理它们。
w``b``s``p{alpha}``p{lower}*UNICODE_CHARACTER_CLASSES
Java通过
^
和$
和处理换行符.
,但是Perl希望Unipre换行符是R
。您应该看一下UNIX_LINES
以了解发生了什么。Java默认情况下不应用任何Unipre大小写折叠。确保将
UNICODE_CASE
标志添加到编译中。否则,您将不会得到各种希腊语西格玛之类的东西。最后,情况有所不同,因为Java 充其量 只进行简单的大小写折叠,而Perl始终进行完整的大小写折叠。这意味着您将无法
xDF
在Java和类似的相关问题中不区分大小写地匹配“ SS”。
总之,最接近的方法是使用标志进行编译
CASE_INSENSITIVE | UNICODE_CASE | UNICODE_CHARACTER_CLASSES
相当于嵌入
"(?iuU)"在模式字符串中。
记住,Java中的匹配并不意味着匹配,这是很不正当的。
编辑
这是故事的其余部分…
编译时,对我而言它不匹配“ PattErn”,但失败
Pattern p = Pattern.compile("/pattern/i"); Matcher m = p.matcher("PattErn"); System.out.println(m.matches()); // prints "false"
您不应在模式周围加斜线。
您能做的最好的就是翻译
$line = "I have your PaTTerN right here";if ($line =~ /pattern/i) { print "matched.n";}这条路
import java.util.regex.*;String line = "I have your PaTTerN right here";String pattern = "pattern"; Pattern regcomp = Pattern.compile(pattern, CASE_INSENSITIVE | UNICODE_CASE // comment next line out for legacy Java bws breakage | UNICODE_CHARACTER_CLASSES ); Matcher regexec = regcomp.matcher(line); if (regexec.find()) { System.out.println("matched");}在那里,看到没有那么容易吗?:)
使用Java会失去的另一件事是,因为Java实际上并不从其头上的孔中的双向链表中知道正则表达式,所以是 模式的编译时编译。
我,我一直认为编译时间是编译的最佳时间,但是请尝试告诉Java。Java使得很难实现非常简单的程序健全性度量,这是您始终需要在每个程序中始终要做的事情。这种设计缺陷是对接的皇家之痛,因为在程序进行到一半时,您会为在编译程序的其余部分时应该在编译时捕获的某些东西感到例外。就像中断性交一样令人生气,因为您正在顺利完成业务,而且一切都毁了。
我没有在上面的代码中实现那种烦人的烦恼的解决方案,但是您可以通过一些静态初始化来伪造它。



