2013-11-22 2 views
5

쉼표 구분 기호가 포함 된 10 진수에 맞는 정규식을 찾는 데 어려움이 있습니다. 내가 그들을 시험했을 때 정말 일이 일반적으로 문제가 있지만 답변 없음에 대한 몇 가지 다른 질문을 찾았어요Regex 쉼표로 10 진수

내가 지금까지있어 최고입니다

[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)? 

이 주요 문제 때문에 멀리 :

1) 두 개의 "3001" "1"로 나누지 않고 "3001 1"사이에 공백이있는 숫자를 기록합니다. - 정규식에서 공백이 허용 된 곳을 실제로 볼 수 없습니다.

2) 정규식의 시작 부분에 일반적인 문제가 있습니다.

정규식이 일치해야합니다

3,001 
1 
32,012,111.2131 

하지만하지 :

32,012,11.2131 
1132,012,111.2131 
32,0112,111.2131 
32131 

를 또한 내가 일치하고 싶습니다 : 상기

1.(without any number after it) 
1,(without any number after it) 
as 1 

(쉼표 나 점 번호의 끝은 간과해야합니다).

많은 감사! .

+0

처음에는 언어의 정규 표현식 라이브러리가 이미 그렇게하지 않는 한, 양 끝 모두에 패턴을 고정시켜야합니다. 그렇지 않으면 적어도 하나의 숫자가있는 문자열이 일치합니다. – cHao

+0

어떤 문자와도 일치하는 마침표 ('''.''')가있는 정규식에서 공백을 허용했습니다. 마침표 (''\ .''')를 빠져 나와 마침표 만 일치시킵니다. – creemama

+0

두 번째 및 세 번째 문제는 전혀 문제가 아니라고 생각합니다. 내가 말할 수있는 것에서는 그들이하지 말아야 할 것을 일치시키지 않을 것입니다. –

답변

2

이것은 매우 길고 복잡한 모든 정규 표현식입니다. 정규 표현식 엔진이 PCRE (PHP, Delphi 또는 R ..를 사용하고 있으면 좋음)를 기반으로하는 경우 작동합니다. 그것은 너무 오래하게

(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$)) 

DEMO on RegExr

것들 : 부분 matchs를 허용하지 않는 동안 단 1 문자 (공백)로 구분하여 같은 줄에 여러 개의 번호가 일치

  1. 이 내다가 필요 및 lookbehind.
  2. .,으로 끝나는 일치하는 숫자는 . 또는 ,을 경기에 포함시키지 않고 다른 미리보기가 필요합니다.

    이 설명을 작성

(?=[,.](\s|$))설명 나는 \s 필요가 문자열의 맨 끝에 1, 일치하는 (\s|$)으로 깨달았다.

정규식의이 부분은 그래서 우리의 수 (끝 부분에있는 .와) 1,000.라고하자 1,000.에서 1,에서 1 또는 1,000 일치입니다.이 (?=[,.](\s|$))

(?=....) 우리가이 곳에서 의미하는 내다는 의미 우리로 이동 있도록

정규식이 1,000 일치했다 지금까지, 그것은 수천 그룹을 반복하는 다른 ,을 찾을 수 없습니다 최대 일치, 무슨 일이 일어나는지 보지만 경기에 추가하지 마십시오.

그래서 , 또는 .이 있는지 확인하고, 존재하는 경우 공백 또는 입력 끝이 바로 뒤지는 지 확인합니다. 이 경우에는 일치가 그대로 유지됩니다. 1,000

Lookahead가 일치하지 않으면 소수점 이하 자릿수를 찾습니다.

+0

지금까지는 훌륭하게 작동하는 것 같습니다. 조금 더 테스트 할게. 고마워요! 설명해주십시오 : (? = [,.] \ s)? – LiranBo

+0

아하. 나는 그 설명을 답에 추가 할 것이다. – OGHaza

+0

Answer updated - 나는 가장자리 케이스를 허용하기 위해 정규 표현식에 약간의 변화를 주어야했다. – OGHaza

1

이것은 당신이

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$ 
+0

에^$ 태그가 있으면 아무 것도 반환하지 않습니다. 위 예제의 경우 을 반환하지 않으면 일치하지 않아야 할 몇 가지 예가 더 많이 반환됩니다. – LiranBo

0

. 수단 "모든 문자"를 열거 한 모든 것들에 대한 작동합니다. 리터럴 .을 사용하려면 \.과 같이 이스케이프 처리하십시오.

제가 아는 한, 그것이 유일한 것입니다.

+0

그는 같은 줄에 여러 개의 숫자를 매치하고자하므로 현재 정규 표현식으로 모든 종류의 불필요한 일치 항목을 가져옵니다. [DEMO] (http://regexr.com?37asm) – OGHaza

+0

어떤 일치하지 않는 항목이 있습니까? 하단 라인에는 부분적으로 일치하지만 유효한 숫자입니다. –

+0

OP가 일치하지 않는 것으로 입력 한 입력에 부분 일치를 허용하지 않을 가능성이 높습니다. 저처럼''-2 -3'과''1 ','2 ','3 ''을 반환하는 양수에 대해 묻고 싶습니다. 물론 그 숫자는 목록에 나오는 양수이지만 유용한 문맥에서 벗어났습니다. – OGHaza