를 사용하여 Perl,어떻게 보면 주위의 상황에 검색어를 검색 결과?

StackOverflow https://stackoverflow.com/questions/616041

  •  03-07-2019
  •  | 
  •  

문제

내가 쓰는 Perl 스크립트를 검색 용어에 큰 부분의 텍스트입니다.고 싶은 전시 사용자에게 다시 작은 하위 집합의 주위에 텍스트 검색어를,그래서 그 사용자가 가질 수 있는 곳의 상황이 검색어가 사용됩니다.Google 검색결과의 좋은 예를 들어 내가 무슨 노력을 달성하는 컨텍스트의 검색어가 표시되는 제목으로의 링크입니다.

내가 기본 검색을 사용:

if ($text =~ /$search/i ) {
    print "${title}:${text}\n";
}

($제목이 포함 항목의 제목 검색어에서 발견되었) 이것은 너무 많이지만,때로는 이후$텍스트의 수백을 들고 있습니다.

이 웹에 표시할 수 있도록 제공으로 제목에 대한 링크는 실제 텍스트,그러나 없 컨텍스트를 이용자에게 있습니다.

I tried 수정 나의 정규 표현식을 캡처하는 4 단어가기 전에 4 말하기,문제에 부딪쳤는 경우 검색어가 시작 또는 끝까지 달러의 텍스트입니다.

무엇을 할 수있는 좋은 방법이 될 것입 to accomplish this?나를 찾 CPAN 내가 확신하기 때문에 누군가가는 모듈이 있습니다 이를 위해,그러나 나는 생각하지 않을 수 있습니는 단어를 검색한다.나 하지 않고 이 모듈은 가능한 경우에는 받고 있기 때문에 모듈을 설치되어 여기에는 것은 고통이다.사람이 어떤 아이디어가 있습니까?

도움이 되었습니까?

해결책

전/후 4 단어의 초기 시도는 그리 멀지 않았습니다.

노력하다:

if ($text =~ /((\S+\s+){0,4})($search)((\s+\S+){0,4})/i) {
    my ($pre, $match, $post) = ($1, $3, $4);
    ...
}

다른 팁

$ $를 사용할 수 있습니다and $' to get the string before and after the match. Then truncate those values appropriately. But as blixtor points out, shlomif is correct to suggest using@+and@-to avoid the performance penalty imposed by $ 그리고 #' -

$foo =~ /(match)/;

my $match = $1;
#my $before = $`;
#my $after = $';
my $before = substr($foo, 0, $-[0]);
my $after =  substr($foo, $+[0]);

$after =~ s/((?:(?:\w+)(?:\W+)){4}).*/$1/;
$before = reverse $before;                   # reverse the string to limit backtracking.
$before =~ s/((?:(?:\W+)(?:\w+)){4}).*/$1/;
$before = reverse $before;

print "$before -> $match <- $after\n";

내가 사용하는 것이 좋습니다 매개변수-@+고@-(볼 수 있 perlvar)을 찾기 위치에서 문자열의 경기,그리고 얼마나 걸립니다.

다음을 시도 할 수 있습니다.

if ($text =~ /(.*)$search(.*)/i ) {

  my @before_words = split ' ', $1;
  my @after_words = split ' ',$2;

  my $before_str = get_last_x_words_from_array(@before_words);
  my $after_str = get_first_x_words_from_array(@after_words); 

  print $before_str . ' ' . $search . ' ' . $after_str;

}

일부 코드는 분명히 생략되었지만 이는 접근 방식에 대한 아이디어를 제공해야합니다.

제목을 추출하는 한 ...이 접근법이 그 자체로는 그 자체로 적합하지 않다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top