当前位置: 首页 > 面试题库 >

如何将此Perl正则表达式转换为Java?

屠德宇
2023-03-14
问题内容

您如何将该Perl正则表达式转换为Java?

/pattern/i

编译时,对我而言它不匹配“ PattErn”,但失败

Pattern p = Pattern.compile("/pattern/i");
Matcher m = p.matcher("PattErn");

System.out.println(m.matches()); // prints "false"

问题答案:

您如何将该Perl正则表达式转换为Java?

/pattern/i

你不能

造成这种情况的原因很多。这里有一些:

  • Java不像Perl那样支持正则表达式语言。它缺少字形支持(如\X)和完整属性支持(如\p{Sentence_Break=SContinue}),缺少Unicode命名字符,没有(?|...|...|)分支重置运算符,\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之前还有许多其他Unicode错误,因此不值得处理它们。\w``\b``\s``\p{alpha}``\p{lower} *UNICODE_CHARACTER_CLASSES

  • Java通过^$和处理换行符.,但是Perl希望Unicode换行符是\R。您应该看一下UNIX_LINES以了解发生了什么。

  • Java默认情况下不应用任何Unicode大小写折叠。确保将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 \b\w\s breakage 
                                        | UNICODE_CHARACTER_CLASSES  
                                );    
Matcher regexec = regcomp.matcher(line);    
if (regexec.find()) {
    System.out.println("matched");
}

在那里,看到没有那么容易吗?:)

使用Java会失去的另一件事是,因为Java实际上并不从其头上的孔中的双向链表中知道正则表达式,所以是 模式的编译时编译。
我,我一直认为编译时间是编译的最佳时间,但是请尝试告诉Java。Java使得很难实现非常简单的程序健全性度量,这是您始终需要在每个程序中始终要做的事情。这种设计缺陷是对接的皇家之痛,因为在程序进行到一半时,您会为在编译程序的其余部分时应该在编译时捕获的某些东西感到例外。就像中断性交一样令人生气,因为您正在顺利完成业务,而且一切都毁了。

我没有在上面的代码中实现那种烦人的烦恼的解决方案,但是您可以通过一些静态初始化来伪造它。



 类似资料:
  • 问题内容: 我目前正在将Web应用程序代码从PHP移植到JS。 我对此正则表达式有疑问。从PHP 这样使用 如何将其转换为在JS上工作? 先感谢您 问题答案: 没什么特别的。PHP regex语法与JavaScript中的语法非常相似: 您可以从 MDN的 本手册中找到有关JavaScript 中正 则表达式的更多信息:https : //developer.mozilla.org/en- US/

  • 我试图将js代码转换为java版本,但对正则表达式有点困惑:在js中,我有一个类似于:testString的表达式。拆分(“/(\w*\d)/g”) 我可以在java中使用什么等效语言?我试着用匹配器得到同样的结果。find()和split函数,但结果不一样。

  • 问题内容: 大约一年前,我从Perl切换到Python,并且没有回头。我发现只有 一个 成语比起Python更容易实现: 由于if语句不断嵌套,因此相应的Python代码不太好用: 有没有人有优雅的方法可以在Python中重现此模式?我已经看到使用了匿名函数调度表,但是对于少量的正则表达式来说,这些表对我来说似乎有点笨拙…… 问题答案: 从开始,并引入赋值表达式(PEP 572) (运算符),我们

  • 主要内容:匹配操作符,实例,正则表达式变量,实例,替换操作符,实例,转化操作符,实例,更多正则表达式规则正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m/ /(还可以简写为/ /,略去

  • 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m//(还可以简写为//,略去m) 替

  • 问题内容: 我知道regEx在各种语言中都很常见…但是我在编写Java语法时遇到了麻烦。我有一个用JS编码的正则表达式; 如何用Java编写相同的代码? 我已经进口了 只是要补充一点,根据我的尝试,它说\ x是无效的转义字符。 问题答案: 将开头和结尾字符更改为,然后将其替换为。 与JavaScript,Perl和其他脚本语言不同,Java对正则表达式没有特殊的语法。相反,它们(通常)使用Java