मुझे पूरा यकीन नहीं है कि जावा में अवधि के लिए सही रेगेक्स क्या है। यहाँ मेरे कुछ प्रयास हैं। अफसोस की बात है कि उन सभी का मतलब किसी भी चरित्र से था।

String regex = "[0-9]*[.]?[0-9]*";
String regex = "[0-9]*['.']?[0-9]*";
String regex = "[0-9]*["."]?[0-9]*";
String regex = "[0-9]*[\.]?[0-9]*";
String regex = "[0-9]*[\\.]?[0-9]*";
String regex = "[0-9]*.?[0-9]*";
String regex = "[0-9]*\.?[0-9]*";
String regex = "[0-9]*\\.?[0-9]*";

लेकिन मैं जो चाहता हूं वह वास्तविक "।" चरित्र ही। किसी के पास कोई विचार है?

मैं वास्तव में जो करने की कोशिश कर रहा हूं वह एक गैर-ऋणात्मक वास्तविक संख्या (दशमलवों की अनुमति) के लिए रेगेक्स लिखना है। तो संभावनाएं हैं: 12.2, 3.7, 2., 0.3, .89, 19

String regex = "[0-9]*['.']?[0-9]*";
Pattern pattern = Pattern.compile(regex);

String x = "5p4";
Matcher matcher = pattern.matcher(x);
System.out.println(matcher.find());

अंतिम पंक्ति झूठी प्रिंट करने वाली है, लेकिन वैसे भी सही प्रिंट करती है। मुझे लगता है कि मेरा रेगेक्स हालांकि गलत है।

6
Gian Alix 29 मार्च 2017, 07:44
अपने सभी उदाहरणों में आपने इसे ? के साथ वैकल्पिक बना दिया है। क्या यही तुम चाहते हो? अवधि केवल \. है, आपको कोष्ठक या किसी अन्य चीज़ की आवश्यकता नहीं है।
 – 
Cfreak
29 मार्च 2017, 07:46
कोशिश करें System.out.println("scary.wombat".replaceAll("\\.", "_"));
 – 
Scary Wombat
29 मार्च 2017, 07:48
यदि आप केवल एक अवधि चाहते हैं, तो इसके चारों ओर संख्याएं क्यों हैं?
 – 
OneCricketeer
29 मार्च 2017, 07:48
कृपया ध्यान रखें कि matcher.find() और matcher.matches() - find() के बीच का अंतर लागू किए गए पूरे क्षेत्र के विरुद्ध काम नहीं करता है।
 – 
Disc-Addict
29 मार्च 2017, 08:18
सबसे अच्छा उत्तर, बल्कि एक शोध लेख यहाँ है: stackoverflow.com/a/39399503/715269
 – 
Gangnus
28 जुलाई 2017, 16:05

4 जवाब

अद्यतन

गैर नकारात्मक दशमलव संख्या से मेल खाने के लिए आपको इस रेगेक्स की आवश्यकता है:

^\d*\.\d+|\d+\.\d*$

या जावा सिंटैक्स में: "^\\d*\\.\\d+|\\d+\\.\\d*$"

String regex = "^\\d*\\.\\d+|\\d+\\.\\d*$"
String string = "123.43253";

if(string.matches(regex))
    System.out.println("true");
else
    System.out.println("false");

आपके मूल रेगेक्स प्रयासों के लिए स्पष्टीकरण:

[0-9]*\.?[0-9]*

जावा से बचने के साथ यह बन जाता है:

"[0-9]*\\.?[0-9]*";

यदि आपको बिंदु को अनिवार्य बनाने की आवश्यकता है तो आप हटा दें? निशान:

[0-9]*\.[0-9]*  

लेकिन यह बिना किसी संख्या के केवल एक बिंदु को स्वीकार करेगा... इसलिए, यदि आप चाहते हैं कि सत्यापन संख्या को अनिवार्य माने तो आप *(जिसका अर्थ है शून्य या अधिक) के बजाय + (जिसका अर्थ है एक या अधिक) का उपयोग करें। वह मामला बन जाता है:

[0-9]+\.[0-9]+
5
Rizwan M.Tuman 29 मार्च 2017, 08:38

शाब्दिक . से मिलान करने के वास्तव में 2 तरीके हैं। एक बैकस्लैश-एस्केपिंग का उपयोग कर रहा है जैसे आप वहां \\. करते हैं, और दूसरा तरीका यह है कि इसे एक कैरेक्टर क्लास या स्क्वायर ब्रैकेट्स जैसे [.] के अंदर संलग्न करना है। . सहित ज्यादातर विशेष वर्ण वर्गाकार कोष्ठक के अंदर शाब्दिक वर्ण बन जाते हैं। इसलिए \\. का उपयोग करें, [.] की तुलना में आपका इरादा स्पष्ट दिखाता है, यदि आप केवल एक शाब्दिक बिंदु . से मेल खाना चाहते हैं। [] का उपयोग करें यदि आप एक से अधिक चीजों से मेल खाना चाहते हैं जो इस या से मेल खाते हैं, उदाहरण के लिए इस रेगेक्स [\\d.] का अर्थ है एक अंक या एक शाब्दिक बिंदु से मेल खाना

0
Teedeez 29 मार्च 2017, 07:56

आपकी प्रारंभिक समझ शायद सही थी, लेकिन आपको फेंका जा रहा था क्योंकि matcher.find() का उपयोग करते समय, आपके रेगेक्स को स्ट्रिंग के भीतर पहला मान्य मिलान मिलेगा, और आपके उदाहरणों में से सभी शून्य से मेल खाएंगे- लंबाई स्ट्रिंग।

मैं सुझाव दूंगा "^([0-9]+\\.?[0-9]*|[0-9]*\\.[0-9]+)$"

0
phatfingers 29 मार्च 2017, 08:34

यदि आप कोटलिन पर हैं, तो ktx का उपयोग करें:

fun String.findDecimalDigits() =
    Pattern.compile("^[0-9]*\\.?[0-9]*").matcher(this).run { if (find()) group() else "" }!!
0
Serg Burlaka 1 मार्च 2019, 18:25