JavaScript의 복잡한 통화 정규 표현식에 대한 힌트?
-
06-07-2019 - |
문제
웹 페이지에서 무한한 수의 수치를 일치시켜야합니다.
다음 형식을 모두 일치시킬 수 있어야합니다.
100 $
99$
$99
$ 8
$.99
$ .8
$ 99.8
.99$
.99 $
9.2 $
1.2$
그리고 쉼표를 사용하는 등가 :
444,333
22,333
1,222
11,111,111
333,333,333,333.01132
또는 공간 :
444 333
22 333
1 222
11 111 111
333 333 333 333.01132
이것은 나에게 정말 어려운 것입니다. 나는 Regexp와 함께 노는 데 익숙하지만 방탄 증명을 완전히 쓰지 못했습니다. 대개 http://www.regexlib.com 해결책은 있지만 이것에 대한 것은 아닙니다.
일반 텍스트 검색/교체이기 때문에 Regexp를 사용하는 것 외에 다른 방법을 생각할 수 없습니다.
해결책
다음은 제공 한 모든 숫자 형식과 일치하는 정규 표현식입니다.
^(?:\$\s*)?(?:(?:\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}|\d+)(?:\.\d*)?(?:\s*\$)?$
분류하려면 :
^(?:\$\s*)?
문자열 시작시 선택적 $를 찾은 다음 공백의 양을 찾습니다.(?:(?:\d{0,3}(?:[, ]\d{0,3])*[, ])+\d{3}|\d*)
쉼표 또는 공간으로 분리 된 그룹으로 분류 된 숫자와 일치합니다 (\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}
) 또는 숫자 문자열 (\d+
) - 그래서 123,456,789, 123 456 789 및 123456789는 모두 일치합니다. 정규 표현식은 부적절한 그룹화가있는 숫자를 허용하지 않습니다 (따라서 123,45,6789는 일치하지 않습니다)(?:\.\d*)?
숫자를 선택적 소수점과 그 다음에 숫자와 일치시킵니다.(?:\s*\$)?$
문자열 끝에 옵션 $와 일치하며 모든 공간이 선행됩니다.
다른 팁
여러 글을 쓸 수있을 때 1 regexp를 작성하고 차례로 적용하는 이유는 무엇입니까?
나는 당신이 라인별 라인을 통해 반복 할 수 있다고 가정합니다 (?). 쉼표에 정통한 regexp를 시도한 다음 공간에 정통한 regexp 등을 시도해보십시오. 일치하는 경우 나머지는 귀찮게하지 말고 결과를 저장하고 다음 줄로 이동하십시오.
두 단계 로이 작업을 수행하는 것은 어떻습니까 :
먼저 모든 공간을 ''로 교체하십시오.
그런 다음 숫자 형식이 항상 동일하면 쉼표를 ''로 바꿀 수 있습니다.
그 후, 꽤 쉽지 않습니까?
제휴하지 않습니다 StackOverflow