가격

2013-09-26 8 views
0
에 대한 정규 표현식을 부정하기

나는 내가하고 싶은 것이 소수 지금과 같은 선택 사항입니다 가격을 일치시키기위한 정규 표현식 지금가격

/[0-9]+(\.[0-9]{1,2})?/ 

이는 식의 역을 얻을 수 있지만하는 데 문제는 이렇게 . 나는 단순한 것을 생각해 냈다.

/[^0-9.]/g 

그러나 이것은 '. 소수점 이하 2 자리 이상의 숫자가 포함됩니다. jQuery를 사용하여 입력 값 필드를 수정하기 위해 흐림에 함수를 대체했습니다. 그래서 같은에서 사용자 유형,

"S의 $의 4sd3.24151. X45 어쩌구 텍스트 ㅋ"또는 "#! %의! $ 43.24.234asdf ㅋ ㅋ ㅋ ㅋ 텍스트 ㅋ"

는 반환한다면

43.24

아무에게도 제안 할 수 있습니까?

+0

아마도 정규식을 무효화하여 수행하려는 실제 작업을 더 잘 수행 할 수 있습니까? 또한 사용중인 프로그래밍 언어를 제공해주십시오. – justhalf

+0

그리고 예상되는 문자열은 정확히 무엇입니까? – justhalf

+0

@justhalf 내가 원하는 것을보다 명확하게하기 위해 질문을 업데이트했습니다. – LJS

답변

1

두 단계로 수행합니다. 먼저 문자가없는 문자가 아닌 문자를 삭제하십시오.

/[^0-9.]//g 

이 각각 제 1 및 제 2 예와 43.24151.4543.24.234을 수득한다. 그러면 첫 번째 정규식을 사용하여 유효한 가격의 첫 번째 발생과 일치시킬 수 있습니다.

/\d(\.\d{1,2})?/ 

이렇게하면 두 예제 모두에 대해 43.24이 표시됩니다.

+0

이 작품은 나를 위해, 고마워! – LJS

0

나는 프로그래밍에서 "역"이 무엇을 의미하는지 항상 명확하지는 않습니다.

내가 제시 한 예를 바탕으로 독점적으로 솔루션을 제안하려면 빈스가 제시 한 것과 매우 유사한 것을 제시 할 것입니다. 캡처 패턴을 반복하여 필요로하는 패턴과 잠재적으로 임의의 숫자를 캡처하는 정규 표현식을 작성하는 데 어려움을 겪고 있습니다. 그리고 이것이 합리적인 방법으로 가능할 지 확신하지 못합니다. 그러나 2 단계 접근법은 간단해야합니다.

'jQuery replace function'을 참조 할 때 jQuery replaceWith 및 replaceAll 함수가 아닌 JavaScript의 replace 함수 (String 객체의 멤버)를 참조하고있는 것으로 보입니다. 후자는 '돔 조작'기능입니다. 그러나, 오해하는 경우에 나를 정정하십시오. 일부 가상의 입력에 따라 예를 들어

, 당신은

<b>var numeric_raw = jQuery('input.textbox').attr ('value').replace (/[^0-9.]/g, "")</b> 

는 숫자 또는 기간없는 텍스트 필드에 입력 된 값에서 모든 문자를 제거하는 데 사용할 수있는, 당신은

<b>var numeric_str = numeric_raw.replace (/^[0]*(\d+\.\d{1,2}).*$/, "$1")</b> 

내가 선도 0 필터링을 포함하고 있다는 점에서 여기에 지정된 클래스 사이 빈스의 대답의 차이를 사용할 수 있습니다. 빈스 (Vince)의 첫 번째 전범국에 여분의 '/'가있을 수 있습니다. 그러나 어쩌면 내가 포기하지 않은 목적이있을 수도 있습니다.

"역행렬"과 관련하여 초기 문의를 이해하는 한 가지 방법은 제공 한 것과 반대의 표현식을 찾는 것입니다. 입력 한 표현식 (/[0-9]+(.[0-9]{1,2})?/)은 정수와 소수점 이하 두 자리를 모두 일치하지만 또한 임의의 한자리 숫자와 일치하므로 주어진 입력 문자열에 대해 상상할 수없는 일치 항목을 식별 할 수 있습니다. 표현식에 앵커 ('^', '$')가 없으므로 가능한 여러 일치를 허용 할 수 있습니다. 예를 들어 문자열 "1.111"에서 "1.11"과 "1"은 사용자가 제공 한 패턴과 일치합니다.

당신의 패턴과 일치하지 않는 문자열과 일치 한 패턴은 다음과 같다, 또는 적어도 대부분의 경우는이 될 수 않는 나에게 나타납니다

/^(?:(?!.*[0-9]+(\.[0-9]{1,2})?).*)*$/ 

- 사람이 식별 할 수있는 경우 정확하게 '역 (inverse)'패턴 이니 자유롭게 생각해보십시오. - 최소한의 뉘앙스를 위해 미리보기가 어떻게 해석되는지 이해하는 데 어려움을 겪고 있습니다.

요즘은 JavaScript가 지원하는 "부정적인 예측"기능에 의존합니다. 자세한 내용은 여러 가지 stackoverflow 게시 (예 : Regular Expressions and negating a whole character group)를 참조 할 수 있으며 인터넷에서 "lookahead"및 "lookbehind"에 대해 설명하는 여러 리소스가 있습니다.

나는이 답변이 이미 주어진 답변과 관련하여 약간의 중복성을 가지고 있다고 가정합니다. 나는 원래 포스터의 게시물이나 Vince의 대답에 대해 (필자의 대답의 일부를 작성하는 대신) 댓글을 달았을 수도 있지만 아직 의견을 낼 수 있어요!

+0

매우 유익한, 나는 몇 가지 것을 배웠다. 저는 정규 표현식을 처음으로 접했습니다. 그건 그렇고, 실제로, 정규식이 0, ​​1 또는 2 소수와 일치하는 것을 의미했습니다. 다시 한 번 감사드립니다! – LJS