正则表达式在使用大数据进行测试时会花费大量时间
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
- 单词边界
请注意,每个后续模式都不会在字符串内的相同位置匹配,这使得它尽可能高效(不过,重叠模式的性能并不是那么好,因为它们必须评估字符串内的每个位置, 从左到右).
我创建了一个 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
- 单词边界
请注意,每个后续模式都不会在字符串内的相同位置匹配,这使得它尽可能高效(不过,重叠模式的性能并不是那么好,因为它们必须评估字符串内的每个位置, 从左到右).