正则表达式在使用大数据进行测试时会花费大量时间

Regex taking a lot of time when tested with large data

我创建了一个 java 正则表达式

(?=\b((?<![^\p{Alnum}\p{Punct}])(?:\p{Alnum}+\p{Punct}\p{Alnum}+){2})\b)

我针对示例字符串测试了此正则表达式:https://www.google.com.google.com

它给了我所有预期的标记:

www.google.com google.com.google com.google.com

但是,上述正则表达式的问题在于,在使用大字符串进行测试时会花费大量时间。

我期望的标记是“字母数字标点符号字母数字”的形式。

如何优化这个正则表达式?

您需要像这样简化正则表达式:

(?=\b((?:\p{Alnum}+\p{Punct}){2}\p{Alnum}+)\b)

参见regex demo

详情:

  • \b - 单词边界
  • ((?:\p{Alnum}+\p{Punct}){2}\p{Alnum}+) - 第 1 组:
    • (?:\p{Alnum}+\p{Punct}){2} - 一个或多个 letters/digits 和一个标点字符出现两次,然后是
    • \p{Alnum}+ - 一个或多个 letters/digits
  • \b - 单词边界

请注意,每个后续模式都不会在字符串内的相同位置匹配,这使得它尽可能高效(不过,重叠模式的性能并不是那么好,因为它们必须评估字符串内的每个位置, 从左到右).