简化一个长而复杂的正则表达式

Simplifying a long complex regex

每次我必须检查输入时,我都不擅长创建正则表达式。

我必须检查输入的格式是否正确。输入格式可以是:

  1. AA:BB:CC DDD/EEE
  2. CC DDD/EEE

不介意大写。 A、B、C 和 D 可以是字母(大写或非大写)或数字。

我想出了这个正则表达式(有效),但如何简化甚至优化它。

([a-zA-Z0-9])*([:])?([a-zA-Z0-9])*([:])?([a-zA-Z0-9])+([ ]){1}([a-zA-Z0-9])+([/]){1}([a-zA-Z0-9])+
  • 如果在[]中只放一个字符,那么[]就多余了,所以[/]可以简化为/, [:]可以简化为:等等

  • 您也不需要指定某些内容重复 {1} 次,因此可以将其删除。

  • 0-9里面的[]可以简化为\d:

应用以上,我们得到:

([a-zA-Z\d])*(:)?([a-zA-Z\d])*(:)?([a-zA-Z\d])+( )([a-zA-Z\d])+(/)([a-zA-Z\d])+
  • (:)? 将捕获 : 或什么都不捕获 (null)。如果您不需要这个,您可以删除该组。同样,( ) 总是会捕获一个 space,这似乎毫无意义。

  • ([a-zA-Z\d])* 只会捕获最后一次重复。您可能想要 ([a-zA-Z\d]*) 或不捕获任何内容。

假设您不想捕获任何内容,因此删除了所有组,我们得到:

[a-zA-Z\d]*:?[a-zA-Z\d]*:?[a-zA-Z\d]+ [a-zA-Z\d]+/[a-zA-Z\d]+

最后但同样重要的是:

  • 一开始,[a-zA-Z\d]*:?重复了两次,我们可以用一个{2}量词。

  • 如果将Pattern.CASE_INSENSITIVE选项传递给Pattern.compile,则不需要每次都指定A-Z

现在我们得到:

([a-z\d]*:?){2}[a-z\d]+ [a-z\d]+/[a-z\d]+