유효한 연도를 테스트하기위한 정규식 일치


89

값이 주어지면 유효한 연도인지 확인하기 위해 유효성을 검사하고 싶습니다. 내 기준은 값이 4문자 가있는 정수 여야하는 경우 간단 합니다. 나는 몇 년 전에 허용하지 않으므로이 최선의 해결책 아니라는 것을 알고 1000등과 같은 년 같은 수 있습니다 5000. 이 기준은 현재 시나리오에 적합합니다.

내가 생각 해낸 것은

\d{4}$

이것이 작동하는 동안 음수 값도 허용됩니다.

양의 정수만 허용되도록하려면 어떻게해야합니까?


fwiw 이러한 범위를 자동으로 생성하기 위해 node.js 프로젝트, to-regex-range 를 만들었습니다. 몇 년 동안 테스트하기 위해 정규식을 생성해야하는 경우에는 생각보다 어렵습니다.
jonschlinkert

유효성 검사를 4 자리 연도로 제한하는 이유는 무엇입니까? longnow.org
Dan Temple

답변:


76

시작 앵커 ^를 다음과 같이 추가해야합니다 .

^\d{4}$

정규식 \d{4}$4 자리 숫자로 끝나는 문자열과 일치 합니다. 따라서 다음과 같은 입력 -1234이 허용됩니다.

시작 앵커를 추가하면 4 자리 숫자로 시작하고 끝나는 문자열 만 일치합니다. 즉, 4 자리 숫자 만 포함되어야합니다.


2
제길! 내 것은 너무나 결함이있어서 받아 들였을 whateverblahblah2323것이다. 약간의 학습이 위험한 이유는 지금은 이해 : O
Ranhiru 유 Cooray

62
이것은 10,000 년에 중단 될 것입니다.
sferik

16
@sferik : 중요하지 않습니다. 원래 포스터에는 4 명의 캐릭터를 확인하고 싶다고 구체적으로 명시되어 있습니다. 그는 10,000 년이 유효한 입력이되기를 원한다고 말하지 않았으므로 받아들이 10000는 것은 버그가 될 것입니다.
markusk

4
@sferik : 프로그램은 그때까지 수세기 동안 사라질 것입니다. 그렇지 않다면 앞으로 9,000 년을 걱정하는 것이 가장 좋습니다. YAGNI의 원칙에 따라 접근 방식이 유효합니다.
Phil

182

1000 년에서 2999 년까지

^[12][0-9]{3}$

1900-2099 년

^(19|20)\d{2}$

14
이것은 훨씬 더 나은 솔루션입니다
mk_89

10
: 나는 비 캡처 그룹을 사용하는 것이 좋습니다^(?:19|20)\d{2}$
엘다 Agalarov

2011 년과 2099 년 사이에 4 자리 연도를 어떻게 검증합니까?
mcquaim

(19|20)\d{2}생년월일 형식의 유효성을 검사하기 위해 정규식에 추가 하려면 어떻게 해야합니까? 이것은 내 정규식 /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/입니다. 연도가 항상 4 자리이고 19 ** 또는 20 **로 시작하도록하고 싶습니다.
ltdev

^ (19 | 2 [0-9]) \ d {2} $를
1900-2999

22

이 질문에 대한 "허용 된"답변은 틀렸고 근시입니다.

0001유효한 연도가 아닌와 같은 문자열과 일치한다는 점에서 올바르지 않습니다 .

9999 이상의 값과 일치하지 않는다는 점에서 근시 적입니다 . 우리는 이미 Y2K 의 교훈을 잊었 습니까? 대신 정규식을 사용하십시오.

^[1-9]\d{3,}$

미래 연도 외에도 과거 연도를 일치시켜야하는 경우 다음 정규식을 사용하여 양의 정수를 일치시킬 수 있습니다.

^[1-9]\d*$

과거의 날짜를 예상하지 않더라도 누군가가 타임머신을 발명하고 소프트웨어를 가져 가고자하는 경우를 대비하여 어쨌든이 정규식을 사용하는 것이 좋습니다.

참고 :이 정규식은 일반적으로 음의 정수 대신 BC 지정으로 표현되기 때문에 1 년 이전의 연도를 포함하여 모든 연도와 일치합니다. 물론이 규칙은 앞으로 몇 천년에 걸쳐 변경 될 수 있으므로 가장 좋은 방법은 다음 정규식을 사용하여 양수 또는 음수 정수를 일치시키는 것입니다.

^-?[1-9]\d*$

3
아니요, 그렇지 않을 것입니다. 그러나 누군가 (고고학자? 역사가?)는 8000 년 전에 몇 년 동안 일치해야 할 수도 있습니다. : D 그리고 닥 브라운 ... 그것을해야 할 수도 있습니다
제이미

1
저는 이것을 사용하여 1000-9999 ^ [1-9] \\ d {3} $ 범위를 제한했습니다. 데이터를 제공해야하는 응용 프로그램이 4 자리 숫자 만 허용합니다. (
MatPag

멋진 대답입니다. 0 년도 허용하려면 다음과 같이 설정합니다. ^ (-? [1-9] \ d * | 0) $
Kosta Kontos

10

이것은 1900 년에서 2099 년까지 작동합니다.

/(?:(?:19|20)[0-9]{2})/

2099 년까지만가는 것처럼 보입니다. BTW OP는 양수 4 자리 숫자 만 허용하는 방법을 묻습니다.
DeanOC

bah, 2099는 내가 의미하는 바입니다. 감사. 이제 양의 정수 부분이 보입니다.
jonschlinkert

이 범위 를 자동으로 생성하기 위해 to-regex-range 라는 프로젝트를 만들었습니다
jonschlinkert

5

1970-2019 년 동안 @ r92 답변을 기반으로 구축 :

(19[789]\d|20[01]\d)

당신의 대답은 할 수 있습니다197999
avalanche1

나는 그렇게 생각하지 않는다 ... 정규식의 첫 번째 부분은 19로 시작하는 숫자와 일치하고 7,8 또는 9 중 하나와 단일 숫자가 뒤 따른다. 정규식 19[789]\d\d\d수있는 것197999
르노

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche1

예, 1970마지막 3 개가 아니라 처음 4 개 숫자 ( ) 와 일치합니다 (19[789]\d|20[01]\d)[^0-9]. 즉 일치합니다 1970 324하지만1970324
르노

1
나는이 경우 ... 파일 이름에서 영화의 해를 찾는 데 유용이 하나가 우리가 이후 1930 년대에서 물건을 원하는 발견 ...하지만 우리는 비디오 품질의 끝에 추가되어 1024 제외
아드리안 흠

2

이론적으로 4 자리 옵션이 옳습니다. 그러나 실제로는 1900-2099 범위를 갖는 것이 더 나을 수 있습니다.

또한 비 캡처 그룹이어야합니다. 많은 의견과 답변이 적절한 IMHO가 아닌 캡처 그룹화를 제안합니다. 일치를 위해 작동 할 수 있지만 정규식을 사용하여 일치를 추출하는 경우에도 paranthesis 때문에 4 자리 숫자와 2 자리 숫자 (19 및 20)를 추출합니다.

이것은 캡처되지 않는 그룹을 사용하는 정확한 일치에 대해 작동합니다.

(?:19|20)\d{2}


1

[ ^-]\d{4}$: 마이너스 기호 -가 4 자리 앞에 오는 것을 방지합니다 . with 를
사용 하여 문자열의 시작 부분을 잡을 수도 있습니다 . 실제로 시나리오에 따라 다릅니다.^\d{4}$^


1

연도와 함께 다른 단어를 포함하는 문자열에서 연도를 테스트하려면 다음 정규식을 사용할 수 있습니다. \ b \ d {4} \ b


이것은 정확히 내가 필요로 한 것이었고 허용 된 답변은 유효한 PCRE가 아닌 것 같습니다.
Prometheus


0

정수를 문자열로 변환 할 수 있습니다. 빼기 기호는 숫자와 일치하지 않으므로 음수 연도는 없습니다.


0

이 정규식을 Java에서 사용합니다. ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

1900에서 9999까지 작동


0

/ ^ \ d {4} $ / 문자열이 4 개의 숫자로만 구성되어 있는지 확인합니다. 이 시나리오에서 989 년을 입력하려면 0989를 대신 입력 할 수 있습니다.


0

YYYY 또는 YYYYMMDD와 일치해야하는 경우 다음을 사용할 수 있습니다.

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$

0

이것을 사용할 수도 있습니다.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)

그들은 연도 만 일치시키고 싶어합니다. 또한 정규식 일치 00/00/2000또는 31/02/1999더 많은 잘못된 날짜.
Toto

도움이 될 수 있습니다. ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01 ] \ d)
Ranjeet Chouhan

(0[1-9]|1[0-2])달에 대한 더 나은 표현이다
EZ-C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.