मैं एक xs: अवधि को सत्यापित करने की कोशिश कर रहा हूं और फिर इसे सेकंड में परिवर्तित कर रहा हूं। इस समय, मेरे पास यही है:

/P^([-])?(([\d.]*)Y)?(([\d.]*)M)?(([\d.]*)D)?T?(([\d.]*)H)?(([\d.]*)M)?(([\d.]*)S)?/

हालांकि, इन अमान्य मानों को अस्वीकार नहीं कर रहा है (यहां से लिया गया है):

  • P-20M ऋण चिह्न पहले दिखाई देना चाहिए
  • P20MT कोई टाइम आइटम मौजूद नहीं है, इसलिए "T" मौजूद नहीं होना चाहिए
  • P1YM5D महीनों के लिए कोई मान निर्दिष्ट नहीं है, इसलिए "M" नहीं होना चाहिए वर्तमान

मुझे किसकी याद आ रही है?

मुझे ऐसा ही एक प्रश्न मिला है यहां , लेकिन वह रेगेक्स केवल पायथन में काम करता है।

0
Daniel Marín 4 अक्टूबर 2018, 13:39

1 उत्तर

सबसे बढ़िया उत्तर

आप कई बिंदुओं को याद कर रहे हैं, जिन्हें आसानी से विफलता के मामलों के विवरण को देखकर संबोधित किया जाता है। निम्न रेगुलर एक्सप्रेशन सभी मामलों (और विफलता के मामलों) के लिए काम करता है, देखें Regex 101

^(-?)P(?=.)((\d+)Y)?((\d+)M)?((\d+)D)?(T(?=.)((\d+)H)?((\d+)M)?(\d*(\.\d+)?S)?)?$

सबसे पहले, P15.5Y only the seconds can be expressed as a decimal को देखें। आप हर जगह [\d.]* का उपयोग करते हैं, जो हर जगह एक या अधिक अंक या बिंदुओं की अनुमति देता है। लेकिन केवल सेकंड में एक ही बिंदु होने की अनुमति है, और उस बिंदु के बाद एक अंक होना चाहिए। इसलिए, सेकंड को (\d*(\.\d+)?S) और अन्य सभी को (\d+Y) (और इसी तरह) में बदलें।

साथ ही, स्ट्रिंग को एक वैकल्पिक -, और फिर P से शुरू करने की आवश्यकता है, इसलिए इसका उपयोग करें:

^-?P

फिर, P के बाद कुछ होना चाहिए, बस उसके लिए एक लुकहेड अभिकथन का उपयोग करें:

(?=.)

फिर, Y, M और D आते हैं, जैसा कि पहले ही चर्चा की जा चुकी है।

यदि कोई समय घटक है, तो अब एक T आना चाहिए, इसलिए सुनिश्चित करें कि हमारे पास एक T है यदि कुछ और आता है:

(T(?=.))

... और केवल अगर हमारे पास T है, तो हमें H, M या S रखने की अनुमति है:

(T(?=.)(\d+H)?(\d+M)?(\d*(\.\d+)?S)?)

लुकहेड दावा यह सुनिश्चित करता है कि हमें कुछ मिल जाएगा, और बाकी एचएमएस भाग को पकड़ लेता है।

1
Corion 4 अक्टूबर 2018, 14:02