Regex сопоставляет определенное значение после определенного количества вкладок

В текстовом файле с разделителями табуляции я хотел бы совместить только строки, содержащие значение « /(?:.+? ){24}1/ » сразу после 24-й вкладки INT E_63 0 0 u Le Le DET : ART DET le ?? ADJ SENT DET : ART NOM ADV SENT DET NOM 1 ?? ?? ?? ?? ?? 0 0 0 0 0 1 ?? ?? ?? ?? ?? ?? INT E_63 0 0 u Le Le DET : ART DET le ?? ADJ SENT DET : ART NOM ADV SENT DET NOM 1 ?? ?? ?? ?? ?? 0 0 0 0 0 0 ?? ?? ?? ?? ?? ?? Прямо сейчас, регулярное выражение, похоже, соответствует тому, что я хочу, но ломается, когда строка не совпадает. Не могли бы вы помочь мне улучшить его?

Мое регулярное выражение:

.

Пример ввода:

^

(Первая строка должна совпадать, вторая не должна).

regex,perl,

2

Ответов: 2


/ ^ (?: [^ т] * т) {24} 1/1" > вверх голосование 3 принял

Ваше регулярное выражение не работает , когда нет ни одного совпадения из - за катастрофические возвраты , как .также соответствует символу табуляции. В сочетании с тем фактом, что после группы с вложенными кванторами и отсутствием 1якоря существует больше подшаблонов, неизбежно происходит катастрофическое обратное отслеживание.

Вам нужен отрицательный класс символов и привязка шаблона в начале строки:

(?!S)

См. Демо-версию regex .

ПРИМЕЧАНИЕ. Чтобы соответствовать 1целому слову, вы можете подумать о добавлении ^после него или в виде списка (?:[^ ]* ){24}.

Детали :

  • [^ ]* - начало строки
  • - 24 последовательности
    • 1 - символы 0+, кроме символов табуляции
    • 1 - символ табуляции
  • 1- 1символ.

2

Вместо использования регулярного выражения вы можете просто разделить его, проверить 24-й столбец на 23-й индекс и затем использовать условные обозначения.

#!/usr/bin/perl
use strict;
use warnings;

open (my $fh, "<", '/path/to/tab_delem_file') or die "Could not open file $!";

while(<$fh>){
  chomp;
  my @line = split/	/, $_; #split on tab
  if ($line[23] == 1){
      #do something
  }
  else ($line[23] == 1){
      #do something else
  }
}
регулярное выражение, Perl,
Похожие вопросы