Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

Java中的正则表达式API,java.util.regex.广泛用于模式匹配。要发现更多,您可以遵循这个文章

在本文中,我们将重点关注具有正则表达式的逃逸字符,并展示如何在Java中完成。

2.特殊regexp字符

根据Java正则表达式API文档,存在一组特殊字符,也称为正则表达式中存在的元字符。

当我们想要允许角色时代而不是用他们的特殊含义解释它们,我们需要逃脱它们。通过逃避这些字符,在将带有给定正则表达式的字符串匹配时,我们会强制将其视为普通字符。

我们通常需要以这种方式逃脱的元字符是:

<([{\ ^ - = $!|]})?* +。>

让我们来看看我们匹配输入的简单代码示例细绳用正则表达式表达的模式。

此测试显示给定输入字符串FOOF.当模式Foo。(Foo以点字符结束)匹配,它返回值真的这表明匹配是成功的。

@test public void telregexwithdot_whenmatchingstr_thenmatches(){string strinput =“foof”;字符串strregex =“foo。”;assertequals(true,strinput.matches(strregex));}

您可能想知道为什么输入没有输入的点(。)字符时匹配成功细绳?

答案很简单。点(。)是一种元桥 - 这里的小点的特殊意义是它的位置可能存在“任何字符”。因此,很清楚匹配如何确定找到匹配项。

让我们说,我们不想以其独特的含义对待点(。)字符。相反,我们希望它被解释为点标志。这意味着在前面的例子中,我们不想让模式Foo。在输入中有一个匹配细绳。

我们如何处理这样的情况?答案是:我们需要逃脱DOT(。)字符,以便忽略其特殊意义。

让我们在下一节更详细地挖掘它。

3.逃脱字符

根据正则表达式的Java API文档,有两种方式可以转义具有特殊含义的字符。换句话说,迫使他们被视为普通字符。

让我们看看他们是什么:

  1. 在与反斜杠(\)的元字段之前
  2. 封装了一个心动杆菌Q.E.

这只是意味着在我们之前看到的例子中,如果我们想逃脱点字符,我们需要在点字符之前放一个反斜杠字符。或者,我们可以将点字符放置在\ q和\ e之间。

3.1。逃脱使用反斜杠

这是我们可以在正则表达式中逃避元字符的技术之一。但是,我们知道反斜杠字符是Java中的转义字符细绳文字也是如此。因此,我们需要将反斜杠字符加倍,以便在任何字符之前(包括\字符本身)。

因此,在我们的示例中,我们需要更改正则表达式,如本测试所示:

@test public void telregexwithdotesc_whenmatchingstr_thennotmatching(){string strinput =“foof”;字符串strregex =“foo \\。”;assertequals(false,strinput.matches(strregex));}

这里,点字符被转义,因此匹配器简单地将其视为点并尝试找到以点以点结束的模式(即Foo。)。

在这种情况下,它返回错误的由于输入中没有匹配细绳对于那种模式。

3.2。使用\ q&\ e

或者,我们可以使用Q.E.逃避特殊角色。Q.表示所有的字符E.需要逃脱和E.意味着我们需要结束开始的逃生Q.

这只是意味着之间的任何东西Q.E.会被逃脱。

在这里显示的测试中,分裂()细绳类使用提供给它的正则表达式进行匹配。

我们的要求是将管道(|)字符拆分为单词。因此,我们使用正则表达式模式来执行此操作。

管道字符是需要在正则表达式中逃脱的元字符。

在这里,通过将管道特性放置在这里来完成逃逸Q.E.

@test public void telregexwithpipeescaped_whensplitstr_thensplits(){string strinput =“foo |酒吧|酒吧|您好|世界”;字符串strregex =“\\ q | \\ e”;assertequals(4,strinput.split(strregex).length);}

4.pattern.quote(字符串s)方法

pattern.quote(string s)方法java.util.regex.pattern.类转换给定的正则表达式模式细绳进入一个字面图案细绳。这意味着输入中的所有元字符细绳被视为普通的人物。

使用此方法是比使用更方便的替代方案Q.E.因为它包裹着给定的细绳跟他们。

让我们在操作中查看此方法:

@test public void telregexwithpipeescquotemeth_whenplitstr_thensplits(string strinput =“foo |酒吧|酒吧|世界”;字符串strregex =“|”;assertequals(4,strinput.split(pattern.quote(strregex))。长度);}

在这个快速测试中,pattern.quote()方法用于逃离给定的正则表达式模式并将其转换为a细绳文字。换句话说,它逃离了我们的正则表达式模式中存在的所有元字符。它做了类似的工作Q.E.

管道特征被逃脱pattern.quote()方法和方法分裂()将其解释为一个细绳它将其划分输入的字面。

正如我们所看到的,这是一个更清洁的方法,而且开发人员也不必记住所有的逃生序列。

我们应该注意到这一点pattern.quote.用单个转义序列封闭整个块。如果我们想要单独逃脱角色,我们需要使用一个令牌替代算法

5.其他例子

让我们看看如何全部替换()的方法java.util.regex.matcher.作品。

如果我们需要替换给定字符的所有出现细绳与另一个一起,我们可以通过将正则表达式传递给它来使用此方法。

想象一下,我们有一个具有多个出现的输入$特点。我们想要得到的结果是与之相同的字符串$字符取代了£。

此测试展示了模式的方式$通过不被转义:

@test public void telregexwithdollar_whenreplacing_thennotplace(){string strinput =“我给了我的兄弟50美元。”+“他买了35美元的糖果。现在他剩下15美元。”;字符串strregex =“$”;字符串strleplacement =“£”;字符串输出=“我给我兄弟50英镑。”+“他买了35英镑的糖果。现在他有15英镑。”;模式p = pattern.compile(strregex);匹配m = p.matcher(strinput);assertthat(产出,不是(等于(m.replaceall(strleplacement)))));}

测试断言$没有正确取代£

现在,如果我们逃脱了正则表达式模式,请更换正确,测试通行证如此代码片段:

@test public void tavexwithdollaresc_whenreplacing_thenreplace(){string strinput =“我给了我的兄弟50美元。”+“他买了35美元的糖果。现在他剩下15美元。”;字符串strregex =“\\ $”;字符串strleplacement =“£”;字符串输出=“我给我兄弟50英镑。”+“他买了35英镑的糖果。现在他有15英镑。”;模式p = pattern.compile(strregex);匹配m = p.matcher(strinput);assertequals(产出,m.replaceall(strleplacement));}

注意\\ $在这里,通过逃避这招$字符并成功匹配模式。

六,结论

在本文中,我们研究了Java中的正则表达式的逃逸字符。

我们讨论了为什么需要逃脱定期表达式的原因,以及可以实现其实现的不同方式。

一如既往,可以找到与本文相关的源代码在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!