VBA (एक्सेल) RegEx खोज के दौरान पाठ को छोड़कर


0

मेरे पास एक्सेल 2016 (वीबीए) में नियमित अभिव्यक्ति का उपयोग करते हुए एक मैक्रो के अंदर एक फ़ंक्शन है जो पाठ से सभी नंबरों को हटा देना चाहिए ताकि मैं मूल रूप से केवल अक्षर वर्णों के साथ समाप्त हो जाऊं। पकड़ यह है कि ये संख्या केवल अंक नहीं हैं, लेकिन वे रोमन अंक भी हो सकते हैं (केवल चार के माध्यम से रोमन अंक शामिल हैं, जो कि I, II, III और IV है)। एक उदाहरण के रूप में, संभावित वस्तुओं की निम्न सूची लें:

Program Manager 3
Systems Engineer 3
Secretary III 12345
Consultant
IT Instructor 3
Computer Operations Manager 1
User Support Specialist 2
Engineering Tech II 12345
IT Instructor 2
Network Tech 3

मेरा फ़ंक्शन अंकों और रोमन अंकों को बदलने के लिए निम्नलिखित VBA नियमित अभिव्यक्ति कोड का उपयोग करता है (मैं इस बिंदु पर ट्रिमिंग या किसी भी चीज़ के बारे में चिंतित नहीं हूं):

Public Function RemoveNumbers(Txt As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "[0-9]|\s[i]+|\s[iv]$"
        RemoveNumbers = .Replace(Txt, "")
    End With
End Function

आम तौर पर, यह ठीक काम करता है, सिवाय इसके कि मैं एक समस्या में भाग जाऊं। मेरा RegEx गलत तरीके से वाक्यांश को बदल देता है आईटी प्रशिक्षक 2 और इसे में बदल देता है ITnstructor (अंतरिक्ष और फिर शब्द के कारण प्रशिक्षक , जो एक के साथ शुरू होता है मैं जो रोमन अंक एक के समान है)। मैंने ऑनलाइन उत्तर खोजने की कोशिश की है और वाक्यांश को बाहर करने के लिए RegEx पाने के लिए कई विविधताओं का परीक्षण किया है प्रशिक्षक खोज में, लेकिन मुझे यह काम करने के लिए नहीं मिल सकता है कुछ पैटर्न जिनका मैंने उपयोग करने की कोशिश की है, उनमें शामिल हैं:

        .Pattern = "\b(!Instructor)\b|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "\b(!Instructor)\b\w+|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "(!Instructor\b)|[0-9]|\s[i]+|\s[iv]$"
...etc

और चूंकि मुझे रोमन अंक एक (एक) को निकालना है, इसलिए मैं निम्नलिखित को वर्कअराउंड के रूप में उपयोग नहीं कर सकता:

        .Pattern = "[0-9]|\s[i]{2,}|\s[iv]$"

क्या एक्सेल 2016 VBA रेगुलर एक्सप्रेशंस का उपयोग करके किसी स्ट्रिंग (जैसे इंस्ट्रक्टर) को सर्च का हिस्सा बनने से बाहर रखा जा सकता है? यदि हां, तो क्या कोई मुझे VBA RegEx के दौरान वस्तुओं को बाहर करने के बारे में सही दिशा में बता सकता है?

धन्यवाद


मैं आमतौर पर वीबीए के साथ रेगेक्स नहीं करता, लेकिन कुछ ऐसा है [^(Instructor)] शायद काम कर जाये
cybernetic.nomad

क्या होगा अगर आप [0-9] को [: अंक:] से बदल दें?
LPChip

इसलिए आप भी चीजों को हटाना चाहते हैं द्वितीय ??
Gary's Student

जवाबों:


1

मैं यह समझ गया। मेरे लिए निम्न सिंटैक्स काम करता है (बहुत परीक्षण और त्रुटि):

    .Pattern = "\b(?!(?:Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

- नीचे दिए गए विवरण जोड़ने के लिए -

मैंने एक अतिरिक्त शब्द जोड़ा (यानी, जानकारी ) RegEx अपवर्जन के लिए:

"\b(?!(?:Info|Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

पैटर्न का विवरण:

  • \ b - शब्द सीमा निर्धारित करें
  • (-? (?: जानकारी। प्रशिक्षक) \ b) - शून्य या एक (?) बहिष्करण (!) शब्दों का पालन करें। गैर-कैप्चरिंग समूह क्योंकि हम उन्हें नहीं चाहते हैं। अंत में \ b एक शब्द सीमा है
  • (?: [0-9] + | \ s [i] + | \ s [iv] $) - एक या अधिक 0 - 9 अंक मिलान करें। एक स्थान (\ s) का मिलान एक या अधिक i वर्णों से करें। Iv के बाद एक स्थान से मिलान करें ($ अंत में खोज कहते हैं)
  • | = या (प्रयुक्त)
  • \ b - अनुगामी शब्द सीमा

- क्योंकि आखिरकार, यह मेरे लिए सबसे अच्छा काम किया -

        .Pattern = "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b"

अच्छा! कोई भी मौका आप उस पैटर्न को तोड़ सकते हैं? मैं एक ही बिंदु पर अटक गया था ओपी था - आप इसे से पहले एक जगह के साथ "मैं" को कैसे अनदेखा करते हैं, एक रोमन अंक नहीं। मैं देखता हूं कि आप बस "इंस्ट्रक्टर" की तलाश में थे, जो मेरे रास्ते से ज्यादा स्मार्ट है, जैसा कि मैं अभी भी अटका हुआ हूं।
BruceWayne

1
हम्म, ऐसा लगता है कि यह भी काम करता है, जब तक कि मैं कुछ याद नहीं कर रहा हूं? (?:[0-9]+|\s[i]+|\s[iv]$)\b
BruceWayne

1
@BruceWayne मुझे लगा कि "I" पर खोज करने के साथ एक पूरे शब्द को अलग करना आसान होगा। मैंने उत्तर को संपादित किया और अभिव्यक्ति के टूटने को जोड़ा।
STGdb

1
@ ब्रूसवेने आप ऊपर के साथ करीब थे, शुरुआती शब्द सीमा की आवश्यकता थी और मुझे एक जोड़ना था + प्रतीक एक या एक से अधिक के बाद RegEx बताने के लिए [Iv] । मेरे लिए अंतिम उत्पाद (इस प्रकार दूर) है "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b" और ऐसा लगता है कि मुझे शुरुआत के बाद के भाग की आवश्यकता नहीं थी।
STGdb

मैं एक्सेल में इसका उपयोग कैसे करूंगा? एक्सेल में VBA के लिए क्षमा करें, इस कोड को लागू करने के तरीके के बारे में कुछ घंटों की खोज और कोशिश कर रहा है।
justif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.