\b
- утверждение нулевой ширины, которое принципиально отличается от [^A-Za-z]
.Поскольку \b
реализовано как if / then (см. Комментарий tchrist ниже), вероятно, будет больше работы, чтобы проверить это для каждой буквы в каждой строке.Кроме того, плюс вызывает откат, который умножает эту стоимость.
Кроме того, когда вы разбиваете границы слов, вы будете сопоставлять больше мест, чем если бы вы просто делили на [^a-zA-Z]+
.Это приведет к выделению большего количества строк, что также займет больше времени.Чтобы увидеть это, попробуйте эту программу:
import java.lang.String;
class RegexDemo {
private static void testSplit(String msg, String re) {
String[] pieces = "the quick brown fox".split(re);
System.out.println(msg);
for (String s : pieces) {
System.out.println(s);
}
System.out.println("----");
}
public static void main(String args[]) {
testSplit("boundary:", "\\b+");
testSplit("not alpha:", "[^A-Za-z]+");
}
}
Возможно, не связано, когда вы используете String.split (), регулярное выражение должно быть скомпилировано для каждого использования.Если вы предварительно скомпилируете регулярное выражение в виде шаблона, например,
Pattern boundary = Pattern.compile("\\b+");
, а затем разделите его с помощью boundary.split(testString)
, вы сэкономите на стоимости компиляции регулярного выражения для каждой тестовой строки.Таким образом, возможно, компиляция «\ b +» медленнее, чем компиляция других шаблонов, которые вы можете проверить, используя здесь предварительно скомпилированную идиому, хотя это вряд ли мне объяснит.
Для получения дополнительной информации о производительности регулярных выражений прочитайте эти статьи Расса Кокса http://swtch.com/~rsc/regexp/ и ознакомьтесь с http://www.regular -expressions.info / тоже.