2011-01-04 4 views
6

현재 여러 권의 문서에서 acronmys를 exctract하려고합니다. 약어의 정규 표현

이 문서는 "정적 애플리케이션 보안 테스트 (SAST)"

그래서 내가 문자열의 이러한 종류를 필터링하는 정규식을 만들려고하고 있어요 포함 말해봐.

"뒤에 중괄호로 반복되는 단어의 수"와 같아야합니다.

불행히도 내 정규식은 이것을 공식화하는 것이 좋지 않습니다. 여러분은 사람들이 정규식을 통해 할 수 있다고 생각합니까 아니면 CFG 기반 파서처럼 더 강력한 무언가가 필요합니까?

+0

어떤 언어입니까? 이것은 닷넷에서 약간의 정규식이 될 수 있지만 자바가 처리 할 수 ​​있는지는 잘 모르겠습니다. 일반적인 대답은 정규식을 사용하는 것은 불가능하지만 ** 단어를 반복하여 수동으로 처리하는 것은 매우 쉽다는 것입니다. 파서는 실제로 필요하지 않습니다. – Kobi

+3

regex가 이것을 할 수 있다고해도 * best-done-via-regex 도메인에 * 속하는지 확실하지 않습니다. [정규 표현식을 사용하거나 사용하지 않으려면] (http://stackoverflow.com/questions/4098086/to-use-or-not-to-use-regular-expressions/4098123#4098123)을 참조하십시오. 괄호 안의 모든 대문자 공백 문자 시퀀스가 ​​뒤 따르는 여러 단어를 찾는 것은 쉽고 가장 좋은 방법입니다. – delnan

+0

Yikes, 내가 처음으로 이것을 읽었을 때 내 두뇌는 * 약어 *에 대한 오너 그램을 잘못 등록했습니다! 정규 표현식이 * 머리 글자 어에 부적절하다는 것을 알지 못합니다 * - 제안 된 해법은 매우 직설적입니다. 그러나 * 아나그램을 생성하기 위해 * 사용하는 것은 본질적으로 바이올린과 같은 단일 스레드 악기에 대위법 대위법을 구현하는 것과 같습니다. 너는 그것을 시도하기 위해 미친, 또는 진정한 주인이되어야 할 것이다 (* viz.* BWV 1001-1006). – tchrist

답변

3

보십시오이 (2 편지 약어에 대한) :

\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\) 

이 3 편지 약어 :

\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\3\) 

이 4 편지 약어에 대한 :

\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\3\4\) 

있습니다 regex는 대소 문자를 구별해야합니다.

BTW Regex Coach은 이와 같은 도구를 시험해보기에 좋은 도구입니다.

+0

아주 영리합니다. +1 – Kobi

+0

나는 그것을 조사 할 것이다. 여기에 정규 표현식의 도구가 있습니다 .info. 전체 이슈에서 뇌 세포를 많이 소비하지 않았습니다. – er4z0r

1

다음은 두 가지 Perl 솔루션입니다. 첫 번째 단어는 단어 단위로 이동하고 모든 단어의 첫 번째 문단이 만든 배열을 만든 다음 해당 문구가 나타내는 두문자어를 제거합니다. 상당히 약하며 한 줄당 두문자와 글자 이상인 경우에는 실패해야합니다 - 정규식에 (? {}) 패턴을 사용하여 정규식에 삽입하면 나를 기분 좋게합니다.

use strict; 
use warnings; 
use 5.010; 

$_ = "Static application security testing (SAST)"; 

my @first; 
s/ 
    \b 
    (?<first>\p{L})\p{L}* 
    \b 
(?{ push @first, $+{first} }) 
    \K \s+ \(
    (??{ join '', map { uc } @first; }) 
    \) 
//gx; 

say; 

한편이 솔루션은 머리 글자와 같은 것을 먼저 확인한 다음 필요한만큼 단어를 일치시키는 정규식을 구성합니다. $ _ = "정적 응용 프로그램 보안 테스트 (SAST)";

my ($possible_acronym) = /\((\p{Lu}+)\)/; 
my $regex = join '', map({ qr/\b(?i:$_)\p{L}*\b\s*?/ } split //, $possible_acronym), qr/\K\Q($possible_acronym)/; 
s/$regex//; 

say; 

는 (나는? (사용하여 솔루션을 만드는 시도 (정의)) 등 tchrist의 대답 here 같은 패턴,하지만 비참하게 실패. 아 글쎄.)에 대한 자세한 내용은

(? :)라는 캡처 (?), \ K, 그리고 부풀어 오르는 것들이 한꺼번에 들자면, perlre이 답이 될 것입니다.

관련 문제