Java 正则表达式教程

Java 正则表达式教程

原文: https://howtodoinjava.com/java-regular-expression-tutorials/

正则表达式用作字符串的搜索模式。 使用正则表达式,我们也可以找到一个或多个匹配项。 我们可以在字符串中查找匹配的任何国王,例如简单字符,固定字符串或任何复杂的字符模式,例如电子邮件,SSN 或域名。

1. 正则表达式

正则表达式是强大,灵活和高效的文本处理的关键。 它允许您描述和解析文本。 正则表达式可以添加,删除,隔离和折叠,纺锤并破坏各种文本和数据。

1.1 元字符和字面值

完整的正则表达式由两种类型的字符组成。

  • 特殊字符(类似于文件名中的*)称为元字符
  • 其余的称为字面值普通文本字符

正则表达式从其元字符提供的高级表达能力中受益。 我们可以将文本视为字面值,将元字符视为语法。 根据一组规则将单词与语法结合在一起,以创建表达思想的表达。

1.2 Java 正则表达式示例

让我们看一个使用正则表达式作为参考的 Java 快速示例。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main 
{
 public static void main(String[] args) 
 {
  Pattern pattern = Pattern.compile("Alex|Brian");
  Matcher matcher = pattern.matcher("Generally, Alex and Brian share a great bonding.");

  while (matcher.find()) {
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(" - " + matcher.group());
        }
 }
}

程序输出。

Start index: 11 End index: 15  - Alex
Start index: 20 End index: 25  - Brian

2. 正则表达式元字符

让我们探索常用的元字符以更好地理解它们。

2.1 行的起点和终点

起点和终点分别用'^'(脱字符)和'$'(美元)符号表示。 插入号和美元的特殊之处在于它们与行中的位置匹配,而不是与任何实际的文本字符本身匹配。

例如,正则表达式“cat”在字符串中的任何位置都可以找到“cat”,但是仅当“cat”位于行首时,“^cat”才匹配。 例如诸如“category”或“catalog”之类的词。

同样,“cat$”仅在“cat”位于行尾时匹配。 例如像“scat”之类的词。

2.2 字符类

通常称为字符类的正则表达式构造"[···]"让我们列出了比赛中该点要允许的字符。 字符类在创建拼写检查器时很有用。

例如,“e”仅与e匹配,而“a”仅与a匹配,而正则表达式[ea]则与之匹配。 例如sep[ea]r[ea]te将匹配所有单词“separate”,“separate”和“separete”。

另一个示例可以是允许将单词的第一个字母大写,例如[Ss]mith将同时允许使用smithSmith这两个字。

同样,<[hH][123456]>将匹配所有标题标签,即H1H2H3H4H5H6

2.2.1 字符范围

破折号"-"表示字符范围。 <[hH][1-6]><[hH][123456]>相似。 其他有用的字符范围是[0-9][a-z],它们匹配数字和英文小写字母。

我们可以在单个结构中指定多个范围 [0123456789abcdefABCDEF]可以写为[0-9a-fA-F]。 请注意,给出范围的顺序无关紧要。

请注意,破折号仅是字符类中的元字符,否则它与常规破折号匹配。 另外,如果它是范围中列出的第一个字符,则它不可能表示范围,因此在这种情况下将不是元字符。

2.2.2 否定字符类

如果我们在字符类中使用否定符号^,则该类与未列出的任何字符匹配。 例如 [^1-6]匹配的字符不是 1 到 6。

2.3 将任何字符与点匹配

元字符.是与任何字符匹配的字符类的简写。 请注意,在字符类中使用点时,它们不是元字符。 在字符类中,它只是一个简单的字符。

例如,06.24.2019将匹配06/24/201906-24-201906.24.2019。 但是 06[.]24[.]2019仅与06.24.2019匹配。

2.4 匹配交替 - 几个子表达式中的任何一个

管道符号'|'允许您将多个表达式组合成一个与任何单个表达式匹配的表达式。

例如,“Alex”和“Brian”是单独的表达式,但是Alex|Brian是一个与两者都匹配的表达式。

与点类似,在字符类中使用管道时,管道也不是元字符。 在字符类中,它只是一个简单的字符。

例如,要匹配单词“First”或“1st”,我们可以编写正则表达式 – “(First|1st)”或简写为"(Fir|1)st"

3. Java 正则表达式 API

Java 具有内置的 API(java.util.regex)以使用正则表达式。 我们不需要任何第三方库就可以对 Java 中的任何字符串运行正则表达式。

Java 正则表达式 API 提供 1 个接口和 3 个类:

  • Pattern – 必须将指定为字符串的正则表达式首先编译为此类的实例。 然后,可以使用所得的模式来创建Matcher对象,该对象可以将任意字符序列与正则表达式进行匹配。

    Pattern p = Pattern.compile("abc");
    Matcher m = p.matcher("abcabcabcd");
    boolean b = m.matches(); //true
    
    
  • Matcher – 此类提供执行匹配操作的方法。
  • MatchResult(接口) – 这是匹配操作的结果。 它包含用于确定与正则表达式匹配的结果的查询方法。
  • PatternSyntaxException – 引发非受检的异常,表示正则表达式模式中的语法错误。

详细了解这些类和重要方法。

3.1 Pattern

它表示正则表达式的编译表示。 要使用 Java 正则表达式 API,我们必须将正则表达式编译为此类。

编译后,其实例可用于创建Matcher对象,该对象可以将行/字符串与正则表达式匹配。

请注意,许多匹配器可以共享同一模式。 处理期间的状态信息保存在Matcher实例中。

此类的实例为不可变的,可以安全地由多个并发线程使用。

  • Predicate asPredicate() - 创建可用于匹配字符串的 Java 8 谓词
  • static Pattern compile(String regex) – 用于将给定的正则表达式编译为模式。
  • static Pattern compile(String regex, int flags) – 用于将给定的正则表达式编译为带有给定标志的模式。
  • int flags() - 用于返回此模式的匹配标志。
  • Matcher matcher(CharSequence input) – 用于创建匹配器,该匹配器将根据该模式匹配给定的输入。
  • static boolean match(String regex, CharSequence input) – 用于编译给定的正则表达式,并尝试将给定的输入与其匹配。
  • String.pattern() – 用于返回从中编译此模式的正则表达式。
  • static String quote(String s) – 用于返回指定字符串的字面模式串。
  • String[] split(CharSequence input) – 用于在此模式的匹配项附近拆分给定的输入序列。
  • String[] split(CharSequence input, int limit) – 用于在此模式的匹配项附近分割给定的输入序列。
  • Stream splitAsStream(CharSequence input) – 根据该模式的匹配从给定的输入序列创建

3.2 Matcher

它是通过解释Pattern在字符串/行上执行匹配操作的主要类。 创建匹配器后,可将其用于执行各种匹配操作。

此类还定义了用新字符串替换匹配子序列的方法,如果需要,可以根据匹配结果计算其内容。

此类的实例是不是线程安全的

  • boolean find() – 主要用于搜索文本中多个出现的正则表达式。
  • boolean find(int start) – 用于从给定索引开始搜索文本中正则表达式的出现。
  • int start() – 用于获取使用find()方法找到的匹配项的开始索引。
  • int end() – 用于获取使用find()方法找到的匹配项的结束索引。 它返回最后一个匹配字符旁边的字符索引。
  • int groupCount() – 用于查找匹配的子序列的总数。
  • String.group() – 用于查找匹配的子序列。
  • boolean matchs() – 用于测试正则表达式是否与模式匹配。
  • boolean lookingAt() – 尝试从区域的开头开始,将模式与输入序列进行匹配。
  • String quoteReplacement(String s) – 返回指定字符串的字面替换字符串。
  • Matcher reset() – 重置此匹配器。
  • MatchResult toMatchResult() – 以MatchResult的形式返回此匹配器的匹配状态。

4. Java 正则表达式示例

阅读下面给出的示例,以了解正则表达式在解决应用程序中这些特定问题方面的用法。

电子邮件地址的正则表达式

学习使用 Java 中的正则表达式匹配电子邮件地址

^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$

用于密码验证的正则表达式

学习使用 Java 中的正则表达式匹配密码

((?=.*[a-z])(?=.*d)(?=.*[@#$%])(?=.*[A-Z]).{6,16})

商标符号的正则表达式

学习使用 Java 中的正则表达式匹配商标符号

\u2122

任何货币符号的正则表达式

学习使用 Java 中的正则表达式匹配货币符号

\\p{Sc}

“希腊扩展”或希腊语脚本中任何字符的正则表达式

使用 Java 中的正则表达式学习在希腊扩展和希腊脚本中匹配字符

\\p{InGreek} and \\p{InGreekExtended}

北美电话号码的正则表达式

学习使用 Java 中的正则表达式匹配北美电话号码

^\\(?([0-9]{3})\\)?[-.\\s]?([0-9]{3})[-.\\s]?([0-9]{4})$

国际电话号码的正则表达式

学习使用 Java 中的正则表达式匹配国际电话号码

^\+(?:[0-9] ?){6,14}[0-9]$

日期格式的正则表达式

学习使用 Java 中的正则表达式匹配日期格式

^[0-3]?[0-9]/[0-3]?[0-9]/(?:[0-9]{2})?[0-9]{2}$

社会安全号码(SSN)的正则表达式

学习使用 Java 中的正则表达式匹配 SSN

^(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$

国际标准书号(ISBN)的正则表达式

学习使用 Java 中的正则表达式匹配 ISBN

^(?:ISBN(?:-1[03])?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})
[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)
(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$

美国邮政编码的正则表达式

学习使用 Java 中的正则表达式匹配美国邮政编码

^[0-9]{5}(?:-[0-9]{4})?$

加拿大邮政编码的正则表达式

学习使用 Java 中的正则表达式匹配加拿大邮政编码

^(?!.*[DFIOQU])[A-VXY][0-9][A-Z] ?[0-9][A-Z][0-9]$

英国邮政编码(邮政编码)的正则表达式

学习使用 Java 中的正则表达式匹配英国邮政编码

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

信用卡号码的正则表达式

学习使用 Java 中的正则表达式匹配信用卡号

^(?:(?4[0-9]{12}(?:[0-9]{3})?)|
		(?5[1-5][0-9]{14})|
		(?6(?:011|5[0-9]{2})[0-9]{12})|
		(?3[47][0-9]{13})|
		(?3(?:0[0-5]|[68][0-9])?[0-9]{11})|
		(?(?:2131|1800|35[0-9]{3})[0-9]{11}))$

更多正则表达式示例

匹配字符串的开头或结尾(行锚)

匹配任何字符或字符集

请在注释中向我发送与此 java 正则表达式教程有关的问题。

学习愉快!

参考文献:

java.util.regex