2008-10-08 4 views
0

내가 정규식에 관해서는 아마추어이고 며칠 전부터 시작했다고 말하는 것으로 서언하겠습니다. 파일 형식을 지정하는 문제를 해결하기 위해 노력 중이며 특정 유형의 데이터로 문제가 발생했습니다. 입력 파일은 다음과 같이 구성되어있다 :정규식 부분 문자열 CSV 일치

 
Two words,Word,Word,Word,"Number, number" 

내가해야 할 것은이 같은 형식 그것이 ...

 
"Two words","Word",Word","Word","Number, number" 

나는 작업

s/,/","/g

의 정규식 패턴이 있었다 단, 이미 따옴표로 묶인 Number, number 섹션의 쉼표를 대체하여 필드를 구분하고 파일을 분리합니다. 필자는 필자의 패턴을 수정하여 쉼표 대신 ","[인용구 쉼표 인용문]을 입력해야하지만 쉼표 뒤에 공백이 오지 않는 경우에만 패턴을 수정해야합니다. 다른 필드는 쉼표 다음에 공백이 없으며 구분 된 번호 목록 만 사용합니다.

나는 적절한 문자열을 맞추어, 쉼표 다음과 같은 편지를 대체 할 것이다,

s/,[A-Za-z0-9]/","/g

을 쓸 수 있었다. 나는 역 참조에 대해 듣고 그것을 사용할 필요가 있다고 생각 하는가? 내 이해는

s/(,)[A-Za-z0-9]\b

일해야하지만 작동하지 않아야합니다.

누구나 아이디어가 있으십니까?

답변

1

"다음에"not-a-space "와 일치하여 not-a-space를 캡처 한 다음 전체를 캡처 된 부분으로 바꿉니다.

사용중인 정규 표현식 엔진에 따라 \1 또는 $1 대신 다른 것을 쓰고있을 수 있습니다.

Perl을 사용 중이거나 부정적 선견자를 사용하는 정규식 엔진에 액세스하는 경우 s/,(?!)/","/ (","뒤에 공백이 없음)이 작동합니다.

입력 내용이 CSV 인 것처럼 보입니다. 실제로 입력 한 내용이 정규 표현식이 아닌 실제 CSV 파서로 구문 분석하는 것이 좋습니다. 걱정할만한 이상한 사례가 많이 있습니다.

+0

나는 CSV 파서를 통해 그것을하고 싶다. 그러나 나는 실제 포맷으로 말할 필요없이이 파일들을 그대로 사용하고있다. 그래서 나는 RegEx를 만지작 거리다. –

+0

s /, (?!)/","/ 감사합니다. Perl을 사용하고 있기 때문에 파일을 보냈을 때 스크립트를 실행할 수 있습니다. Parser에서 열어 저장하고 거기에서 작업하는 것을 저장합니다. 게다가 Perl과 RegEx를 배워서 어쨌든 하나의 돌로 두 마리의 새를 배우고 싶었습니다. 당신의 도움을 주셔서 감사합니다 :). –

2

제 경험으로 보면 정규 표현식을 잘 사용하지 못했을 것입니다. 이미 말했듯이 CSV 파일은 실제 CSV 파서가 더 잘 처리합니다. 당신은 언어에 태그를 붙이지 않았기 때문에 말할 수는 없지만 Perl에서는 Text :: CSV_XS 또는 DBD :: CSV를 사용합니다 (SQL이 CSV 파일을 마치 테이블 인 것처럼 액세스 할 수있게합니다. 물론, 커버 아래에 Text :: CSV_XS를 사용). 내 자신을 굴리기보다 훨씬 간단하고 정규식을 사용하는 것보다 훨씬 튼튼합니다.

0

이 질문은 유사합니다. Replace patterns that are inside delimiters using a regular expression call.

이 일할 수 : 당신이 Sed의를 사용하고 같은

s/"([^"]*)"|([^",]+)/"$1$2"/g 
+0

Heh, Isaac이 원하는 것 대신에 Isaac이 원하는 것을 성취합니다 :) 당신은 조금 더 좋아할 수 있고 CSV의 인용문도 처리 할 수 ​​있습니다 ... 미리 작성된 CSV 파서가 될 수있을 때 정규식으로 처리하는 것은별로 중요하지 않습니다. 더 잘해라. – ephemient

+0

이렇게하는 데는 두 가지 주요 이유가있었습니다. 하나는 Perl을 배우고 싶었고 RegEx는이 문제를 해결할 수있는 것처럼 보였습니다. 둘째로, 나는 정기적으로이 파일들을 건네주고 있으며 그들에 대한 스크립트를 실행할 수 있다는 것은 나에게 많은 시간을 절약 해 준다. –

0

보인다.

패턴이 약간 일관성이없는 것처럼 보이지만 모든 항목을 쉼표로 구분하여 인용문을 사용하고 싶다고 가정합니다.그렇지 않으면 정규 표현식이 처리 할 수없는 계산상의 복잡성이있는 영역을 보게됩니다. sed를 통해

, 명령은 다음과 같습니다 당신은 여전히해야합니다

sed 's/[ \"]*,[ \"]*/\", \"/g' 

참고 문자열의 시작 부분과 끝 부분에 쌍 따옴표를 넣어.