2016-10-28 3 views
2

여러 개의 열 값을 검사하는 정규식 목록이 있습니다. 열은 탭 구분 기호로 구분됩니다. 필자는 32 개의 열과 12 개의 열을 필요로합니다. 그래서 내 파일에 총 44 개의 열이 있다면 목록 전체를 실행해야하지만 32 개가있는 경우 나머지 목록을 선택적으로 만들려고합니다. 내가 44 열이있는 경우에만 내가 그들을 사용할 수있는 방법은 내 목록에서 이러한 추가 열을 선택 할 수 있을지 궁금하네요특정 위치에서 정규 표현식을 선택하는 방법은 무엇입니까?

<cfset myRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t([^\t]*)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z0-9 '-.;]{1,100}|NULL)\t([A-Za-z '-]{1,50}|NULL)\t(\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\d+|NULL)\t([A-Za-z '-]{1,50}|NULL)\t((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL)\r?$"> 

: 여기 내 정규 표현식입니다. 각각의 옵션 컬럼 이후에 ?을 넣으려고했으나 작동하지 않았다. 나의 정규식은 그 경우에 false를 출력하고 있었다. 여기

은에서 선택 열 (\의 t)와 정규식 업데이트됩니다

<cfset fileRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t(([^\t]*)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$"> 

이 잘 작동하지 않았다. 데이터와

예 :

<cfset myData = "Ruiz John 09/01/1984 M 00 Red Star player 3345678879 0 0 0 0 0 1     0 0 0  0 0 0 0 0  19234 1011 0089 01"> 

<cfif REFind(fileRegex,myData,true) GT 0> 
    true<br> 
<cfelse> 
    false<br> 
</cfif> 
+0

정규식에 24 개가 포함되어 있습니다. '\ t'. 사실, 당신이 필요로하는 것이 명확하지 않고 패턴이 너무 길어서 샘플 문자열 없이는 디버그가 불가능합니다. –

+0

@ WiktorStribiżew 만약 당신이 7 번째 줄을 잘 살펴 본다면 \ t 안에 22 개의 컬럼을 포함하고있는 {22}을 나타냅니다. (\ t [^ \ t] *) {22} 나는 그 분야에 대해 엄격한 검증을 사용하지 않았다. 탭이 없는지 확인하는 것뿐입니다. –

+1

[here] (https://regex101.com/r/FJVdso/1) 표현식을 사용해보십시오. 나는 당신의 정규식이 거의 옳다고 가정한다. (정말로, 나는 그것을 제대로 디버깅하는 방법을 알 수 없다.하지만 아무도 할 수 없다.)'\ t'가 의무적 인 그룹에 배치되는 곳을 발견했다. (아마도 나는 모든 데이터를 필요로하지는 않는다). –

답변

2

귀하의 고정 정규식

^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t[^\t]*(\t([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$ 

regex demo is here입니다.

(([A-Za-z '-]{1,20}|NULL)\t)? (=> (\t([A-Za-z '-]{1,20}|NULL)\t)?) 옵션 그룹에 (([^\t]*)\t)?에서 이동이 필요 하나 \t 있었다.

0

괄호()로 선택 열의 정규식 (한 \의 t)를 포장 한 후 추가? 마지막에

+0

(한 개는 \ t)? 각 열/정규 표현식 뒤에 \ t를 포함해야합니까? –

+0

예, 정규 표현식 부분을 선택적으로 만들면 두 개의 탭 (\ t) – Paul0PT

+0

으로 끝납니다. 내 질문을 업데이트했습니다. 나는 그것을 시도했지만 작동하지 않았다. 어쩌면 내 코드에서 뭔가 잘못 됐을 수도 있습니다. –

관련 문제