खोज…


जब अभिव्यक्ति में Regex मिलान के लिए मुहावरे

अपरिवर्तनीय स्थानीय लोगों का उपयोग करना:

"अनाम अस्थायी" टेम्पलेट की तुलना में कम क्षैतिज स्थान लेकिन अधिक ऊर्ध्वाधर स्थान का उपयोग करता है। when "लूप में अभिव्यक्ति" हो तो "अनाम अस्थायी" टेम्पलेट पर अधिमानतः - उस स्थिति में, रेगेक्स परिभाषाओं को लूप के बाहर रखा जाना चाहिए।

import kotlin.text.regex

var string = /* some string */

val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */

when {
    regex1.matches(string) -> /* do stuff */
    regex2.matches(string) -> /* do stuff */
    /* etc */
}

अनाम अस्थायी का उपयोग करना:

"अपरिवर्तनीय स्थानीय लोगों" टेम्पलेट की तुलना में कम ऊर्ध्वाधर स्थान लेकिन अधिक क्षैतिज स्थान का उपयोग करता है। तब उपयोग नहीं किया जाना चाहिए यदि तब when अभिव्यक्ति एक लूप में हो।

import kotlin.text.regex

var string = /* some string */

when {  
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    /* etc */
}

विज़िटर पैटर्न का उपयोग करना:

वाक्यविन्यास when "तर्क-पूर्ण" का बारीकी से अनुकरण करने का लाभ मिलता है। यह फायदेमंद है क्योंकि यह अधिक स्पष्ट रूप से when अभिव्यक्ति के तर्क को इंगित करता है, और कुछ प्रोग्रामर गलतियों को भी रोकता है, जो कि हर when whenEntry में तर्क को whenEntry । या तो "अपरिवर्तनीय स्थानीय लोगों" या "अनाम अस्थायी" टेम्पलेट का उपयोग विज़िटर पैटर्न को लागू करने के साथ किया जा सकता है।

import kotlin.text.regex

var string = /* some string */

when (RegexWhenArgument(string)) {
    Regex( /* pattern */ ) -> /* do stuff */
    Regex( /* pattern */ ) -> /* do stuff */
    /* etc */
}

और when अभिव्यक्ति तर्क के लिए आवरण वर्ग की न्यूनतम परिभाषा:

class RegexWhenArgument (val whenArgument: CharSequence) {
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}

कोटलिन में नियमित अभिव्यक्ति का परिचय

यह पोस्ट बताता है कि Regex वर्ग में अधिकांश फ़ंक्शन का उपयोग कैसे किया जाता है, Regex फ़ंक्शन से संबंधित सुरक्षित रूप से नल के साथ काम करते हैं, और कच्चे तार कैसे रेगेक्स पैटर्न को लिखना और पढ़ना आसान बनाते हैं।

RegEx वर्ग

कोटलिन में नियमित अभिव्यक्तियों के साथ काम करने के लिए, आपको उस regex ऑब्जेक्ट पर Regex(pattern: String) वर्ग का उपयोग करने और find(..) या replace(..) जैसे फ़ंक्शन को लागू करने की आवश्यकता है।

यदि input स्ट्रिंग में c या d Regex , तो Regex वर्ग का उपयोग कैसे करें, इस पर एक उदाहरण:

val regex = Regex(pattern = "c|d")
val matched = regex.containsMatchIn(input = "abc")    // matched: true

सभी Regex कार्यों के साथ समझने के लिए आवश्यक बात Regex है कि परिणाम रेगेक्स pattern और input स्ट्रिंग के मिलान पर आधारित है। कुछ कार्यों के लिए एक पूर्ण मैच की आवश्यकता होती है, जबकि बाकी के लिए केवल एक आंशिक मैच की आवश्यकता होती है। उदाहरण में उपयोग किए जाने वाले containsMatchIn(..) फ़ंक्शन को आंशिक मिलान की आवश्यकता है और बाद में इस पोस्ट में समझाया गया है।

नियमित अभिव्यक्ति के साथ अशक्त सुरक्षा

दोनों find(..) और matchEntire(..) एक matchEntire(..) लौटेगा MatchResult? वस्तु। ? के बाद चरित्र MatchResult Kotlin संभाल करने के लिए आवश्यक है सुरक्षित रूप से अशक्त

एक उदाहरण जो दर्शाता है कि कोटलिन एक Regex फ़ंक्शन से सुरक्षित रूप से नल को कैसे संभालता है, जब find(..) फ़ंक्शन शून्य देता है:

val matchResult = 
    Regex("c|d").find("efg")           // matchResult: null
val a = matchResult?.value             // a: null
val b = matchResult?.value.orEmpty()   // b: ""
a?.toUpperCase()                       // Still needs question mark. => null    
b.toUpperCase()                        // Accesses the function directly. => ""

orEmpty() फ़ंक्शन के साथ, b अशक्त और नहीं हो सकता ? जब आप कार्य को b पर कहते हैं तो चरित्र अनावश्यक है।

यदि आप शून्य मानों के इस सुरक्षित संचालन की परवाह नहीं करते हैं, तो कोटलिन आपको जावा जैसे शून्य मानों के साथ काम करने की अनुमति देता है !! पात्र:

a!!.toUpperCase()                      // => KotlinNullPointerException

रेगेक्स पैटर्न में कच्चे तार

कोटलिन जावा पर एक कच्ची स्ट्रिंग के साथ एक सुधार प्रदान करता है जो डबल बैकस्लैश के बिना शुद्ध रेगेक्स पैटर्न लिखना संभव बनाता है, जो कि जावा स्ट्रिंग के साथ आवश्यक हैं। एक कच्ची स्ट्रिंग को एक ट्रिपल उद्धरण के साथ दर्शाया गया है:

"""\d{3}-\d{3}-\d{4}""" // raw Kotlin string
"\\d{3}-\\d{3}-\\d{4}"  // standard Java string

खोजें (इनपुट: चारसुविधा, startIndex: Int): MatchResult?

Regex ऑब्जेक्ट में pattern खिलाफ input स्ट्रिंग का मिलान किया जाएगा। यह एक Matchresult? लौटाता है Matchresult? के बाद सबसे पहले मिलने वाला पाठ के साथ वस्तु startIndex , या null अगर पैटर्न से मेल नहीं खाती input स्ट्रिंग। परिणाम स्ट्रिंग को MatchResult? से पुनर्प्राप्त किया जाता है MatchResult? वस्तु का value संपत्ति। डिफ़ॉल्ट मान 0 के साथ startIndex पैरामीटर वैकल्पिक है।

संपर्क विवरण के साथ एक स्ट्रिंग से पहला वैध फोन नंबर निकालने के लिए:

val phoneNumber :String? = Regex(pattern = """\d{3}-\d{3}-\d{4}""")
    .find(input = "phone: 123-456-7890, e..")?.value // phoneNumber: 123-456-7890

input स्ट्रिंग में कोई मान्य फ़ोन नंबर नहीं होने से, चर phoneNumber null हो जाएगा।

findAll (इनपुट: चारसेंसेंस, स्टार्टइंडेक्स: इंट): सीक्वेंस

input स्ट्रिंग से सभी मैच लौटाता है जो रेगेक्स pattern मेल खाता है।

अक्षरों और अंकों के साथ एक पाठ से, अंतरिक्ष के साथ अलग किए गए सभी नंबरों को प्रिंट करने के लिए:

val matchedResults = Regex(pattern = """\d+""").findAll(input = "ab12cd34ef")
val result = StringBuilder()
for (matchedText in matchedResults) {
    result.append(matchedText.value + " ")
}

println(result) // => 12 34

matchedResults चर के साथ एक दृश्य है MatchResult वस्तुओं। अंकों के बिना एक input स्ट्रिंग के साथ, findAll(..) फ़ंक्शन एक खाली अनुक्रम लौटाएगा।

माचिसइंटरायर (इनपुट: चारसामेंस): माचिस

यदि input स्ट्रिंग के सभी अक्षर रेगेक्स pattern मेल खाते हैं, तो input बराबर स्ट्रिंग वापस आ जाएगी। वरना, null लौटा दिया जाएगा।

इनपुट स्ट्रिंग लौटाता है अगर पूरा इनपुट स्ट्रिंग एक संख्या है:

val a = Regex("""\d+""").matchEntire("100")?.value             // a: 100
val b = Regex("""\d+""").matchEntire("100 dollars")?.value     // b: null

माचिस (इनपुट: चारसेंसेंस): बूलियन

यदि पूरा इनपुट स्ट्रिंग रेगेक्स पैटर्न से मेल खाता है, तो सही है। असत्य अन्यथा।

टेस्ट यदि दो स्ट्रिंग्स में केवल अंक होते हैं:

val regex = Regex(pattern = """\d+""")
regex.matches(input = "50")             // => true
regex.matches(input = "50 dollars")     // => false

मेमैच इन (इनपुट: चारसेंसेंस): बूलियन

यदि इनपुट स्ट्रिंग का हिस्सा रेगेक्स पैटर्न से मेल खाता है, तो सही है। असत्य अन्यथा।

यदि दो तारों में कम से कम एक अंक होता है तो परीक्षण करें:

Regex("""\d+""").containsMatchIn("50 dollars")       // => true
Regex("""\d+""").containsMatchIn("Fifty dollars")    // => false

विभाजन (इनपुट: चारसुधार, सीमा: Int): सूची

सभी regex मैचों के बिना एक नई सूची देता है।

अंकों के बिना सूची वापस करने के लिए:

val a = Regex("""\d+""").split("ab12cd34ef")     // a: [ab, cd, ef]
val b = Regex("""\d+""").split("This is a test") // b: [This is a test]

प्रत्येक विभाजन के लिए सूची में एक तत्व है। पहले input स्ट्रिंग में तीन नंबर होते हैं। तीन तत्वों के साथ एक सूची में यह परिणाम है।

बदलें (इनपुट: चारसुधार, प्रतिस्थापन: स्ट्रिंग): स्ट्रिंग

रिप्लेक्स pattern सभी मिलानों को input स्ट्रिंग में रिप्लेक्स स्ट्रिंग के साथ बदल देता है।

एक x के साथ एक स्ट्रिंग में सभी अंकों को बदलने के लिए:

val result = Regex("""\d+""").replace("ab12cd34ef", "x") // result: abxcdxef


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow