Если вы хотите регулярное выражение, которое захватывает только третье поле и ничего больше, вы можете использовать следующее:
String regex = "(?:[^\\t]*)\\t(?:[^\\t]*)\\t([^\\t]*)\\t(?:[^\\t]*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
System.err.println(matcher.group(1));
}
Я не знаю , будет ли это работать лучшечем split("\\t")
для анализа большого файла.
ОБНОВЛЕНИЕ
Мне было любопытно посмотреть, как будет работать простое разбиение по сравнению с более явным регулярным выражением, поэтому я протестировал триразличные реализации парсера.
/** Simple split parser */
static class SplitParser implements Parser {
public String parse(String line) {
String[] fields = line.split("\\t");
if (fields.length == 4) {
return fields[2];
}
return null;
}
}
/** Split parser, but with compiled pattern */
static class CompiledSplitParser implements Parser {
private static final String regex = "\\t";
private static final Pattern pattern = Pattern.compile(regex);
public String parse(String line) {
String[] fields = pattern.split(line);
if (fields.length == 4) {
return fields[2];
}
return null;
}
}
/** Regex group parser */
static class RegexParser implements Parser {
private static final String regex = "(?:[^\\t]*)\\t(?:[^\\t]*)\\t([^\\t]*)\\t(?:[^\\t]*)";
private static final Pattern pattern = Pattern.compile(regex);
public String parse(String line) {
Matcher m = pattern.matcher(line);
if (m.matches()) {
return m.group(1);
}
return null;
}
}
Я запускал каждые десять раз один и тот же файл с миллионами строк.Вот средние результаты:
- split: 2768,8 мс
- скомпилированный сплит: 1041,5 мс
- регулярное выражение группы: 1015,5 мс
Ясно, что важно скомпилировать ваш шаблон , а не полагаться на String.split , если вы собираетесь использовать его несколько раз.
Результатна скомпилированном регулярном выражении split против группы не является окончательным на основании этого тестирования.И, возможно, регулярное выражение может быть улучшено для повышения производительности.
UPDATE
Еще одна простая оптимизация состоит в том, чтобы повторно использовать Matcher, а не создавать по одной итерации цикла.
static class RegexParser implements Parser {
private static final String regex = "(?:[^\\t]*)\\t(?:[^\\t]*)\\t([^\\t]*)\\t(?:[^\\t]*)";
private static final Pattern pattern = Pattern.compile(regex);
// Matcher is not thread-safe...
private Matcher matcher = pattern.matcher("");
// ... so this method is no-longer thread-safe
public String parse(String line) {
matcher = matcher.reset(line);
if (matcher.matches()) {
return matcher.group(1);
}
return null;
}
}