मैं गो में असंवेदनशील नियमित अभिव्यक्ति कैसे करूँ?


84

अब, बेशक, मैं दोनों मामलों को संभालने के लिए अपनी नियमित अभिव्यक्ति लिख सकता हूं, जैसे कि regexp.Compile("[a-zA-Z]"), लेकिन मेरी नियमित अभिव्यक्ति उपयोगकर्ता द्वारा दिए गए स्ट्रिंग से निर्मित है:

reg, err := regexp.Compile(strings.Replace(s.Name, " ", "[ \\._-]", -1))

s.Nameनाम कहाँ है जो 'नॉर्थ बाय नॉर्थवेस्ट' जैसा कुछ हो सकता है। अब, मेरे लिए सबसे स्पष्ट समाधान प्रत्येक अक्षर के लिए चलना s.Nameऔर प्रत्येक अक्षर के लिए '[nN]' लिखना होगा:

for i := 0; i < len(s.Name); i++ {
  if s.Name[i] == " " {
    fmt.Fprintf(str, "%s[ \\._-]", str);
  } else {
    fmt.Fprintf(str, "%s[%s%s]", str, strings.ToLower(s.Name[i]), strings.ToUpper(s.Name[i]))
  }
}

लेकिन मुझे लगता है कि यह एक गैर-सुरुचिपूर्ण समाधान है। गति वास्तव में एक चिंता का विषय नहीं है, लेकिन मुझे यह जानने की आवश्यकता है कि क्या कोई और तरीका है।

जवाबों:


171

आप regex में पहले आइटम के रूप में केस-असंवेदनशील ध्वज सेट कर सकते हैं।

आप इसे "(?i)"रेगेक्स की शुरुआत से जोड़कर करते हैं।

reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \\._-]", -1))

एक निश्चित रेगेक्स के लिए यह इस तरह दिखेगा।

r := regexp.MustCompile(`(?i)CaSe`)

झंडे के बारे में अधिक जानकारी के लिए, "झंडे" शब्द के लिए regexp/syntaxपैकेज प्रलेखन (या वाक्यविन्यास दस्तावेज़ीकरण ) खोजें।


4
लेकिन मैंने पाया कि यह बहुत धीमा है, जब कई डेटा हैं। Ungeode.SimpleFold को regexp.Match में शामिल करने के कारण, इसलिए मैं ऊपरी अक्षरों को बदलने और फिर मिलान करने के लिए regexp का उपयोग करने का सुझाव देता हूं। यह गति है। निम्नलिखित समय डेटा है: XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / चौखटे-कोड / चौखटे 1271.9% उपयोगकर्ता 7.32s प्रणाली 97% cpu के मामले को नजरअंदाज करने के लिए `` #By (? I) regexp। 21: 54.95 कुल #By टॉपर और XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / चौखटे-कोड / फ्रेमवर्क 263.87s उपयोगकर्ता 8.99s प्रणाली 110% Bpu 4: 06.44 कुल `` `
QJGui

1
ऐसा लगता है कि केस-असंवेदनशील रेगेक्स के लिए धीमी गति से प्रदर्शन एक ज्ञात बग था जो निम्नलिखित महीनों में तय किया गया था: github.com/golang/go/issues/13288
Dan Esparza

29

आप (?i)मामले को असंवेदनशील बनाने के लिए पैटर्न की शुरुआत में जोड़ सकते हैं ।

संदर्भ



4

iझंडे का इस्तेमाल करें । टिप प्रलेखन उद्धृत करते हुए :

समूहन:

(re)           numbered capturing group
(?P<name>re)   named & numbered capturing group
(?:re)         non-capturing group
(?flags)       set flags within current group; non-capturing
(?flags:re)    set flags during re; non-capturing

फ्लैग सिंटैक्स xyz (सेट) या -xyz (स्पष्ट) या xy-z (सेट xy, स्पष्ट z) है। झंडे हैं:

i              case-insensitive (default false)
m              multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
s              let . match \n (default false)
U              ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)

22
कोड में मुझे ये i, m, s और U कहां डालने चाहिए?
कियान चेन

25
यह उत्तर दस्तावेज़ीकरण के समान ही अयोग्य है। शुक्र है, नीचे एक कार्यकारी उदाहरण है।
लौरेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.