TL; DR
일부 언어 (예 : Java)에서 이스케이프 문제를 방지 하려면 [.]
대신 \.
및 [0-9]
대신 사용하십시오 \d
.
원래 이것을 인식 한 이름없는 사람 에게 감사합니다 .
부동 소수점 수 를 일치 시키는 비교적 간단한 패턴 은 다음과 같습니다.
[+-]?([0-9]*[.])?[0-9]+
다음과 일치합니다.
참조 작업 예를
또한 일치 시키려면 123.
(소수점이없는 마침표) 약간 더 긴 표현식이 필요합니다.
[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)
이 패턴에 대한 자세한 설명은 pkeller의 답변 을 참조하십시오.
16 진수 및 8 진수와 같은 10 진수가 아닌 숫자를 포함하려면 문자열이 숫자인지 어떻게 식별합니까?에 대한 답변을 참조하십시오 . .
당신이하려는 경우 확인 입력은 숫자 (대신 입력 내 번호를 찾는) 인 것을, 당신은과 패턴을 포위해야 ^
하고 $
, 그래서 같은 :
^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$
불규칙한 정규 표현식
대부분의 최신 언어, API, 프레임 워크, 라이브러리 등에 구현 된 "정규식"은 형식 언어 이론 에서 개발 된 개념을 기반으로합니다 . 그러나 소프트웨어 엔지니어는 이러한 구현을 공식적인 정의를 훨씬 뛰어 넘는 많은 확장 기능을 추가했습니다. 따라서 대부분의 정규식 엔진은 서로 유사하지만 실제로는 표준이 없습니다. 따라서 사용중인 언어, API, 프레임 워크 또는 라이브러리에 따라 많은 것이 달라집니다.
(부수적으로 혼동을 줄이기 위해 많은 사람들이 " regex "또는 " regexp " 를 사용하여 이러한 향상된 일치 언어를 설명했습니다. 자세한 내용 은 RexEgg.com에서 정규 표현식과 정규 표현식이 동일합니까? 를 참조하십시오.)
즉, 대부분의 정규식 엔진 (실제로 내가 아는 한 모두)은 \.
. 대부분의 경우 이스케이프에 문제가 있습니다.
탈출 문제
일부 언어에는 JavaScript와 같은 정규식에 대한 기본 지원이 있습니다. 그렇지 않은 언어의 경우 이스케이프가 문제가 될 수 있습니다.
이것은 기본적으로 언어 내의 언어로 코딩하기 때문입니다. 예를 들어 Java는 \
문자열 내에서 이스케이프 문자로 사용 하므로 문자열 내에 리터럴 백 슬래시 문자를 배치하려면 이스케이프해야합니다.
// creates a single character string: "\"
String x = "\\";
그러나 regexe 는\
이스케이프 에도 문자를 사용 하므로 리터럴 \
문자 와 일치 시키려면 regexe 엔진에 대해 이스케이프 한 다음 Java에 대해 다시 이스케이프해야합니다.
// Creates a two-character string: "\\"
// When used as a regex pattern, will match a single character: "\"
String regexPattern = "\\\\";
귀하의 경우 프로그래밍하는 언어에서 백 슬래시 문자를 이스케이프하지 않았을 것입니다.
// will most likely result in an "Illegal escape character" error
String wrongPattern = "\.";
// will result in the string "\."
String correctPattern = "\\.";
이 모든 탈출은 매우 혼란 스러울 수 있습니다. 작업중인 언어가 원시 문자열 을 지원 하는 경우 백 슬래시 수를 줄이기 위해이를 사용해야하지만 모든 언어가 지원하는 것은 아닙니다 (특히 Java). 다행히도 가끔 작동하는 대안이 있습니다.
String correctPattern = "[.]";
정규식 엔진, \.
그리고 [.]
정확히 같은 일을 의미한다. 줄 바꿈 ( \\n
), 여는 대괄호 ( \\[
) 및 백 슬래시 ( \\\\
또는 [\\]
) 와 같이 모든 경우에 작동하는 것은 아닙니다 .
일치하는 숫자에 대한 참고 사항
(힌트 : 생각보다 어렵습니다)
숫자를 일치시키는 것은 정규식으로 매우 쉽다고 생각하는 것 중 하나이지만 실제로는 매우 까다 롭습니다. 귀하의 접근 방식을 하나씩 살펴 보겠습니다.
[-+]?
선택적 -
또는 일치+
[0-9]*
0 개 이상의 연속 숫자와 일치
\.?
선택 사항 일치 .
[0-9]*
0 개 이상의 연속 숫자와 일치
첫째, 숫자에 대한 문자 클래스 속기 를 사용하여이 표현식을 약간 정리할 수 있습니다 (위에서 언급 한 이스케이프 문제의 영향을 받기도합니다).
[0-9]
= \d
\d
아래에서 사용하려고하는데 [0-9]
. (실제로 일부 엔진 \d
에서는 모든 스크립트의 숫자와 일치하므로 원하는 것보다 더 많이 일치 [0-9]
하지만 귀하의 경우에는 그다지 중요하지 않을 것입니다.)
이제 이것을주의 깊게 살펴보면 패턴의 모든 부분이 선택 사항 이라는 것을 알 수 있습니다 . 이 패턴은 길이가 0 인 문자열과 일치 할 수 있습니다. +
또는 로만 구성된 문자열 -
; 또는 .
. 이것은 아마도 당신이 의도 한 것이 아닐 것입니다.
이 문제를 해결하려면 최소한의 필수 문자열 (아마도 한 자리 숫자 일 수 있음)로 정규식을 "고정"하여 시작하는 것이 좋습니다.
\d+
이제 소수점 부분을 추가하고 싶지만 여러분이 생각하는 곳에 가지 않습니다.
\d+\.?\d* /* This isn't quite correct. */
이것은 여전히 123.
. 더 나쁜 것은 그것에 대해 사악한 색조가 있습니다. 마침표는 선택 사항입니다. 즉, 두 개의 반복되는 클래스가 나란히 표시됩니다 ( \d+
및 \d*
). 잘못된 방식으로 사용하면 시스템이 DoS 공격에 노출 될 경우 실제로 위험 할 수 있습니다.
이 문제를 해결하려면 마침표를 선택 사항으로 처리하는 대신 필수로 처리하고 (반복 문자 클래스를 구분하기 위해) 대신 전체 소수 부분을 선택 사항으로 만들어야합니다.
\d+(\.\d+)? /* Better. But... */
이것은 이제 더 좋아 보입니다. 첫 번째 숫자 시퀀스와 두 번째 숫자 사이에 마침표가 필요하지만 치명적인 결함 .123
이 있습니다. 이제 선행 숫자가 필요하기 때문에 일치 할 수 없습니다 .
이것은 실제로 수정하기가 매우 쉽습니다. 숫자의 "십진수"부분을 선택적으로 만드는 대신 문자 시퀀스로 살펴볼 필요 .
가 있습니다. 0 개 이상의 숫자가 접두사로 붙을 수있는 a 가 접두사로 붙을 수있는 1 개 이상의 숫자 :
(\d*\.)?\d+
이제 기호를 추가합니다.
[+-]?(\d*\.)?\d+
물론 이러한 슬래시는 자바에서 매우 성가 시므로 긴 형식의 문자 클래스로 대체 할 수 있습니다.
[+-]?([0-9]*[.])?[0-9]+
매칭 대 검증
이것은 주석에서 두 번 언급되었으므로 일치와 유효성 검사에 대한 부록을 추가하고 있습니다.
매칭 의 목표는 입력 내에서 일부 콘텐츠를 찾는 것입니다 ( "건초 더미의 바늘"). 유효성 검사 의 목표는 입력이 예상 형식인지 확인하는 것입니다.
정규식은 본질적으로 텍스트 와 만 일치 합니다. 입력이 주어지면 일치하는 텍스트를 찾거나 찾지 못할 것입니다. 그러나, 처음으로 식을 "스냅"앵커 태그 (와 입력의 종료로 ^
하고 $
), 우리는 전체 입력 효율적으로 정규 표현식에를 사용하여 표현과 일치하지 않는 일치하는 항목이없는 것을 확인할 수 있습니다 검증 .
위에서 설명한 정규식 ( [+-]?([0-9]*[.])?[0-9]+
)은 대상 문자열 내에서 하나 이상의 숫자 와 일치 합니다. 그래서 주어진 입력 :
apple 1.34 pear 7.98 version 1.2.3.4
정규식이 일치합니다 1.34
, 7.98
, 1.2
, .3
와 .4
.
주어진 입력이 숫자이고 숫자인지 확인하려면 표현식을 앵커 태그로 래핑하여 입력의 시작과 끝에 "스냅"합니다.
^[+-]?([0-9]*[.])?[0-9]+$
전체 입력이 부동 소수점 숫자 인 경우에만 일치 항목을 찾고 입력에 추가 문자가 포함 된 경우 일치 항목을 찾지 않습니다. 따라서 입력이 주어지면 1.2
일치 항목을 찾을 수 있지만 일치 항목을 찾을 수 apple 1.2 pear
없습니다.
일부 정규식 엔진에는 기본적으로 내가 설명한대로 자동으로 수행 하는 validate
, isMatch
또는 유사한 함수 true
가 있으며 일치 항목이 발견되고 일치 항목이 없으면 반환 합니다 false
. 또한 일부 엔진에서는 전체 입력의 시작 / 끝이 아닌 줄의 시작 / 끝과 일치하는 ^
및 의 정의를 변경하는 플래그를 설정할 수 있습니다 $
. 이것은 일반적으로 기본값은 아니지만 이러한 플래그를 확인해야합니다.