2011-04-21 2 views
0

부분 문자열의 값을 추출하기 위해 정규 표현식과 일치 시키려고합니다. 정규 표현식 구문을 읽었지만 아직 제대로 이해할 수없는 것 같습니다.정규 표현식으로 고민하고 있습니다 - 새로운 것

나는이 HTTP 응답에서 오는 다음 내가 지정한 경우 따옴표없이 파일 이름의 값을 추출하기 위해 노력하고있어

Content-Disposition: attachment; filename=Subtitle.197747.zip; type=s 
Content-Disposition: attachment; filename="file one.txt" type=s 
Content-Disposition: attachment; filename="file one.txt"; type=s 
Content-Disposition: attachment; filename=Subtitle.197747.zip type=s 

. 같은 것을 함께했다 :

`.*filename="?(?<filename>[^;"]*)\s?.*` 

그러나 이것은 몇 가지 지침을 이해할 것, 트릭을 할 것 같지 않습니다. 귀하의 답변

모두에게 감사, 나는 그들 모두를 읽고 갔다 : 나에게 문제를주고 "나는 (제대로 컴파일 중 \의를 얻을하는 방법을 잘 모르겠어요하지만

filename="?(?<filename>[^;"]+)[\s;"] 

또는)

+0

정규 표현식을 처음 사용하는 경우 문자열 메소드로 대신 할 수 있습니다. IMHO 정규 표현식이 사용됩니다. – juharr

+0

파일 예제의 값과 형식 매개 변수 사이에 세미콜론이없는 마지막 예제는 [RFC2183] (http://www.ietf.org/rfc/rfc2183.txt)을 읽을 때 잘못되었습니다. – Richard

답변

2

첫째는 전체 문자열과 일치 할 필요가 없습니다 당신은 가까운이

filename="?(?<filename>[^;"]+)[;"\s]*type 
+0

나를 이길! - +1 – Dve

+1

이 사이트는 놀라워서 많은 사람들이 도와주고 싶어합니다. 나는 Ed의 답장 후에 그 표현을 사용하기로 결정했다. 정규 표현식이 과용 될 수 있다는 것을 알고 있으며 동의합니다.하지만 이것은 저에게 좋은 습관이었습니다. 감사합니다. – Meniya

1

regex (imo)의 트릭은 한번에 너무 많이하지 않도록 요구하는 것입니다. 따옴표를 신경 쓰지 않는 표현식을 작성한 다음 일반 절차 코드에서 따옴표를 찾아 스트립합니다 필요하다면 별도의 regex를 사용하여 원한다면 앞뒤의 따옴표를 찾을 수도 있습니다 (그러나 거의 필요하지 않습니다).

이유는 정규 표현식이 작업에 적합하지 않다는 이유가 아닙니다. 당신은 확실히이 모든 것을 하나의 표현으로 표현할 수 있습니다. 그 이유는 (다시 : imo) 정규 표현식의 복잡성과 유지 관리 패널티가 제공된 기능보다 훨씬 더 빠른 속도로 증가하는 경향이 있기 때문입니다. 여기에는 정규식이 완벽하고 우아한 솔루션 인 스위트 스폿이 있지만 너무 멀리 가져가는 것은 쉽습니다.

당신이 지금 가지고있는 문제는, 그러나, 당신의 \s 식의 끝이 당신의 가치를 얻을하는 데 사용되는 [^;"]* 문자 클래스 내에서 적합하고, 별표 욕심 때문에, 당신은 매우 자주 일치하지 않을거야 근처에 그입니다 일부. 귀하의 샘플을 기반으로, 나는 후행 조건으로 ;? type=s을 사용하고 싶습니다.

+1

또한 http://regexhero.net과 같은 것을 가지고있어 매우 편리하다고 생각합니다. 실시간으로 정규 표현식이 어떻게 작동하는지보고, 디버깅/탐색을 줄이는 방법을 살펴 보겠습니다. –

0

filename="?(?<filename>[^;"]+)["\s] 
0

을하려고 시도하기 때문에 초기 및 최종 .* 제거 할 수 있습니다 : 당신에게 간단한 더 나은 것을 유지할 수 있습니다.

마지막 예제가 잘못되었다고 가정하면 (Q에 대한 내 의견 참조) 사이의 모든 항목과 세미콜론과 문자열의 끝이 필요합니다. 문자 클래스에서 교체해야하는 두 번째 .+ 불구하고

filename=("[^"]+"|.+)\s*(;|^) 

: 값은 인용하는 경우, 세미콜론 그래서 뭔가처럼 (빨리 읽기를 기반으로 valueRFC2045에서 token의 정의 참조)를 포함 할 수 있습니다 token (ASCII의 하위 집합)에있는 유효한 문자 중 하나입니다.

파일 이름은 첫 번째 캡처 값이됩니다.

0

이 일을 할 것입니다 답변이 많이 있습니다, 여기 내 꺼야 :

filename=\"?([^;"]+).*type 

정규 표현식을 테스트하기 위해, 나는 Expresso를 사용합니다. 무료 다운로드이며 정규식이 실제로 찾고있는 것의 영어 표현을 제공합니다. 이것은 실제로 편리합니다.

관련 문제