정규식 : 그룹 매칭은 어떻게 유용합니까?


6

나는 정규 표현식의 기초를 배우기로 결심했다. Regex One 강의를 온라인으로 사용하고 있는데 강의 11 잠시 동안, 그러나 나는 그것을 지금 얻었다고 생각한다.

이것은 과제였습니다.

"아래 PDF 파일의 파일 이름 (확장명 제외)과 일치하는 정규식을 작성하십시오."

task            text                     capture
capture text    file_a_record_file.pdf   file_a_record_file
capture text    file_yesterday.pdf       file_yesterday
skip text       testfile_fake.pdf.tmp

작업을 완료하기 위해 패턴을 입력하는 입력 필드가 있습니다. 몇 번의 시행 착오 끝에 이것이 내가 생각해내는 것입니다.

^(file_a_record_file)\.pdf$

파일 이름과 일치합니다. file_a_record_file.pdf 그러나 단지 "붙잡는다" file_a_record_file . 차이점은 무엇입니까? ... 매칭과 "캡쳐"의 차이점은 무엇입니까? 그리고 이것은 어떻게 유용합니까? 이 "그룹 일치"는 어떻게됩니까?

이제 첫 번째 파일은 작동하지만 두 번째 파일은 작동하지 않습니다. 작업은 확장을 제외하고 두 파일의 파일 이름을 일치시키고 캡처 할 패턴을 만들어야한다고 말합니다. 이것이 내가 다음에 올린 것입니다.

^(file_.*)\.pdf$

두 파일 이름이 파일_ 그와 일치시켜 다음에 나오는 문자와 일치하도록 말한 다음 괄호 ( "괄호 안에 들어있는 그룹", "맞습니까?")를 사용하여 그룹을 종료하고 점을 이스케이프 처리하는 것이 좋습니다. 백 슬래시 및 파일 이름 확장자로 끝납니다.

더 단단한 방법으로 설명 할 수 있습니까? 올바른 해결책은 웹 사이트에 나와 있지 않습니다. 그래서 나는 내 대답을 확인할 필요가 없다. 이것이 정규 표현식에 대한 좋은 소개라고 생각하기 때문에 유감입니다. 각 공과에 주어진 예는 때때로 이해하기가 어렵습니다.

그리고 다시, 이것은 어떻게 유용합니까? 그는 커맨드 라인에 대해 언급하고 있습니다. 커맨드 라인이나 커맨드를 재사용 할 수 있다는 것을 의미한다고 생각합니다.

우리가 각 파일을 복사하는 명령 줄 도구가 있다고 상상해보십시오.   디렉토리가 이미 존재하지 않는 경우에만 서버에 연결   결과로 각 파일 이름을 인쇄합니다. 이제 다른 작업을하고 싶다면   그 각각의 파일 이름, 그럼 난뿐만 아니라 정기적으로 필요하지 않습니다   파일명과 일치하는 표현식뿐만 아니라 추출 할 수있는 방법   그 정보.

정보를 추출 하시겠습니까? 무슨 소리 야? 누군가가 이것이 유용하고 어떻게 현실 세계의 예를 들어 주는지 말해 주시겠습니까?

답변:


8

링크 된 강의에서이 두 파일의 파일 이름을 캡처하는 정규식을 작성해야합니다.

file_a_record_file.pdf
file_yesterday.pdf

건너 뛴다.

testfile_fake.pdf.tmp

가장 간단한 정규식은 다음과 같습니다.

(.*)\.pdf$

이것은 끝나는 모든 것을 의미합니다. .pdf 파일 이름 만 캡처합니다.

그렇다면 캡처가 왜 유용한가요? 그건 당신 이이 regexes를 사용하는 프로그램에 따라 다릅니다. 패턴을 캡처하면 캡처 한 것을 변수로 저장할 수 있습니다. 예를 들어, Perl을 사용하면 첫 번째 캡처 패턴은 다음과 같습니다. $1, 두번째 $2 기타:

echo "Hello world" | perl -ne '/(.+) (.+)/; print "$2 $1\n"'

첫 번째 괄호 때문에 "world Hello"가 인쇄됩니다. 포착 된 Hello 두 번째 캡처 된 world 그러나 우리는 인쇄를하고있다. $2 $1 그래서 두 개의 일치가 반전됩니다.

다른 정규식 구현을 사용하면 캡처 된 패턴을 참조 할 수 있습니다. \1, \2 예를 들어, GNU sed:

echo "Hello world" | sed 's/\(.*\) \(.*\)/\2 \1/'

따라서 일반적으로 패턴 캡처는 나중에이 패턴을 참조해야 할 때 유용합니다. 이것은 참조 당신이하고있는 튜토리얼에서 잠시 후에 간단히 설명합니다.


이것은 컴퓨터 프로그래밍에 유용합니다. 이 기능을 사용하여 파일 이름의 일부만 클립 보드에 복사 할 수 있습니까? 어쩌면 일부 텍스트 편집기 또는 명령 줄 프롬프트에서? 캡쳐가 변수에 복사하는 것을 의미한다면 텍스트 파일로 출력하거나 클립 보드로 복사 할 수 있습니까? 내가 맞습니까? ...
Samir

2
@Samy 네, 맞습니다. 나중에 다른 정규 표현식에서 캡처 된 참조를 사용하거나 다른 변수로 복사, 인쇄, 더 많이 mangle, 다른 프로그램에 대한 인수로 사용 등 모든 유형의 조작을 사용할 수 있습니다.
MattDMo

@MattDMo 이것이 어떻게 유용 할 수 있는지보기 시작했습니다. 사실, 이것은 정말로 강력한 것들입니다. 일반적으로 "그룹 캡처"가 아니라 정규식입니다. 하지만 실제로 사용하는 도구에 따라 다릅니다. 정규식은 Windows의 cmd에서 지원됩니까? 와일드 카드가 좋아. *? 정규식으로 간주 되는가? 아마 상식이 아니겠습니까? regex에서 나는 이것을 지금까지 본 것으로 알려져있다. .*.
Samir

저는 주로 정규 작업을 자동화하는 데 도움이되는 정규 표현식에 관심이 있습니다. 요즘 텍스트 편집을 위해 메모장에서 몇 번 사용했습니다. 지루하고 반복적 인 작업을 쉽게 할 수 있습니다.
Samir

@Samy Windows 구현 * 약간 다릅니다. 어쨌든 .* "어떤 문자든지 여러 번 매치"를 의미합니다. * 단지 "여러 번"을 의미합니다. ? 다른 구현에서 다른 것을 의미합니다. 세부 정보는 사용중인 정규 표현식에 따라 다릅니다. 메모장 + +는 당신이 배우는 것과 약간 다를 수있는 독자적인 것을 가지고 있습니다. 그러나 어떤 정규 표현식을 배우는 것은 다른 것을 이해하는 것을 매우 단순화시킵니다. 그들은 모두 비슷합니다.
terdon

1

짧은 것 :

(.*)\.pdf$



캡처 / 그룹화 이유 :

당신이 통과 프로그램에 대한 정규 표현식을 사용하거나 프로그램에서 사용한다면 저장 그만큼 성냥 그룹화를 사용합니다.

위의 예제 정규식을 사용하면 정규식이 일치하는지 프로그램에서 확인합니다. 에워싸는 함께 ( )

데모:

String stringToCheck = "example.pdf";           // Example string for testing
Pattern p = Pattern.compile("(.*)\.pdf$");      // Matching regex
Matcher m = r.matcher(stringToCheck);           // Java's own component to 'match' the string, proccessing is here
if (m.matches()) {                              // Check if the regex has matched
                                                // What? How to reterive the filename?
                                                // That's why we grouped our filename in the regex
    String filename = m.group(1);               // Reterive the first grouped part
    System.out.println(filename);               // Java's own way to print string, this is printing filename
}                                               // ??? PROFIT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.