我创建了一个java正则表达式
(?=\b((?<![^\p{Alnum}\p{Punct}])(?:\p{Alnum}+\p{Punct}\p{Alnum}+){2})\b)
我针对示例字符串测试了此正则表达式:https://www.google.com.google.com
它给了我所有预期的 token :
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}
- 出现两次一个或多个字母/数字和一个标点符号,然后\p{Alnum}+
- 一个或多个字母/数字
\b
- 单词边界
请注意,每个后续模式在字符串内的同一位置都不匹配,这使得它尽可能高效(尽管如此,重叠模式的性能并不是那么好,因为它们必须评估字符串内的每个位置,从从左到右)。
关于java - 使用大数据进行测试时,正则表达式需要花费大量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72402371/