2010-02-18 4 views
2

필드 형식을 확인하기 위해 RegEx를 사용할 수있는 상용 응용 프로그램을 사용하고 있습니다. 일반적으로 이것은 꽤 잘 작동합니다. 그러나 오늘은 다음 문자열의 유효성 검사에 직면했습니다. 간단한 산술 연산자 (+ -/*)가있는 인용 영문 숫자 코드. 분명히 사용자가 공백을 추가하는 경우가 있습니다 (예 : 'FLR01'대신 '  FLR01'). 또는 하위 처리시 문제가되는 불일치 괄호와 같은 다른 오타가있을 수 있습니다.간단한 수학을 검증 할 수있는 정규식을 쓸 수 있습니까?

첫 번째 예는 모두 5 개 코드가 추가되고 있었다 :

"FLR01"+ "FLR02"+ "FLR03"+ "FMD01"+ "FMR05"

그래서 나는 일치의 길을가는 시작 문자열 인용 5 개 영숫자 :

"[0-9A-ZA-Z] {5}"[+ - * /]

그러나, 공식 신속 열심히했고 나도 몰라 방법 다음과 같은 합병증을 피하십시오.

  1. 각 코드 사이에 네 개의 간단한 수학 연산자 (+ - * /) 중 하나를 테스트해야하지만 마지막 코드 이후는 테스트하지 않아도됩니다.
  2. 위의 예 에서처럼 5 개가 아닌 여러 개의 코드가 함께 추가 될 수 있습니다.
  3. 대괄호 괄호 ("X"+ "Y")/"2"
  4. 괄호가 맞지 않습니다.
  5. 수식이 없습니다 (예 : 공백). 괜찮습니다.

유효을 :

"FLR01"+"FLR02"+"FLR03"+"FMD01"+"FMR05" 
"0XT"+"1SEAL"+"1XT"+"23LSL"+"23NBL" 
("LS400"+"LT400")*"LC430"/("EL414"+"EL414R"+"LC407"+"LC407R"+"LC410"+"LC410R"+"LC420"+"LC420R") 

잘못된 :

" FLR01" +"FLR02" 
"FLR01"J"FLR02" 
("FLR01"+"FLR02" 

가 쉽게 정규식로 할 수있는이없는 것이 있습니까? 230517에 대한 Jeff의 답변을 바탕으로, 나는 적어도 "매치 된 페어링"문제에 실패했다고 생각합니다. 괄호 문제를 해결할 수 없더라도 문제의 부분적 해결책 (예 : 여분의 공백을 표시하거나 잘못된 연산자)을 사용하는 것보다 더 나은 방법이 될 수 있습니다. 제안이 환영되었습니다!

감사합니다,

당신이 정규 표현식에 괄호 일치를 확인할 수 없습니다 알다시피
+0

구문 분석 문법을 살펴보십시오. BNF, _inspiration_을위한 yacc/lex 도구. – mctylr

+0

불행히도 이것은 선택적 속성 유효성 검사 옵션으로 regex가있는 상용 응용 프로그램입니다. StackOverflow 포드 캐스트를 듣고 이것에 대한 Joel/Jeff의 토론을 회상하겠습니다.하지만이 예제에서는 응용 프로그램 외부의 프로그래밍 방식 솔루션에 대한 정규 표현식의 부분적인 솔루션을 선호합니다. 궁극적으로 그 일이 올 수도 있지만, 나는 지금 당장 보류하고 싶습니다. –

답변

3

스티븐. regexes에는 상태를 기억하고 중첩 된 괄호를 계산할 방법이 없기 때문에 더 강력한 무언가가 필요합니다.

이것은 괄호를 계산하고 카운터를 증가 및 감소시키는 간단한 파서를 코드에 전달할 수있는 간단한 구문입니다. 당신은 단순히 카운터가 부정적이되지 않도록해야합니다.

나머지는 어떻습니까?

("[0-9a-zA-Z]+"([+\-*/]"[0-9a-zA-Z]+")*)? 

또한이 정규식을 사용하여 괄호를 확인할 수도 있습니다. 제대로 중첩되어 있는지 확인하지는 않지만 열린 괄호와 닫는 괄호가 올바른 위치에 표시되는지 확인합니다. 위에 설명 된 카운터에 추가하면 올바른 유효성 검사기가 생깁니다.

(\(*"[0-9a-zA-Z]+"\)*([+\-*/]\(*"[0-9a-zA-Z]+"\)*)*)? 
+0

John, 답장을 보내 주셔서 감사합니다. 그러나 지금까지 나는 당신의 정규 표현식을 일치시킬 수 없습니다. [0-9a-zA-Z]는 인용 부호의 한 문자와 일치하는 것으로 보입니다. 하나 이상의 크기가 필요합니다. [+ \ - * /]는 작동하지만 수식의 마지막 코드와 일치하도록 가져올 수는 없습니다. RegexBuddy에서 디버깅을 시도했지만 아직 깨지지 않았습니다. –

+0

죄송합니다. 함께 시작한 정규식을 확인하지 않았습니다. 하나 이상의 영숫자와 일치하는'+'를 추가했습니다. –

1

토큰 (숫자, 연산자 등)과 일치 시키려면 정규 표현식을 쉽게 사용할 수 있지만 균형 조정 된 괄호는 일치시킬 수 없습니다. 하지만 너무 큰 문제는 아닙니다. 일치하는 토큰에서 작동하는 상태 시스템을 만들어야하기 때문입니다. 당신이 이것들에 익숙하지 않다면, 당신이 어디 있는지, 어디에 갈 수 있는지를 추적하는 프로그램 내의 흐름 차트로 생각하십시오. Wikipedia page을 살펴볼 수도 있습니다.

+0

불행히도, 저는 쉽게 토큰에 대한 정규 표현식을 사용할 수 없습니다. 그것이 당신을 위해 쉬운 경우에, 공유하십시오. :-)이 정규 표현식은 상용 응용 프로그램의 속성 유효성 검사기이므로 상태 시스템 솔루션을 사용할 수 없습니다. –

+0

자신의 유효성 검사기를 설정하는 메커니즘이 없습니까? 다른 폼 유효성 검사기와 함께이 기능을 사용할 수 있습니다. –

+0

일종. 핵심 유효성 검사가 가장 효율적으로 발생하며 (크기가 크지 않고 다른 속성에 대한 참조 등) 정규 표현식이 핵심 중 하나입니다. 핵심 검증 외에도 스크립트 및 프로그램에 의한 검증이 있습니다. 이러한 유효성 검사는 핵심 유효성 검사 후 호출되며 관심있는 특성뿐만 아니라 데이터의 전체 범주에 적용됩니다. 물론 이름으로 관리하는 특성 만 대상으로 지정할 수 있지만 이러한 추가 유효성 검사에 성능 영향이있을 수 있습니다 게다가 일반적으로 그들을 유지하는 비용이 있습니다. –

관련 문제