खोज…


वाक्य - विन्यास

  • regexp? स्विच? Exp स्ट्रिंग? माचिस? ? सबमैचवर सबमैचवर ...?
  • Regsub? स्विच? ऍक्स्प स्ट्रिंग सबस्पेक? varName

टिप्पणियों

यह विषय स्वयं नियमित अभिव्यक्तियों पर चर्चा करने का नहीं है। नियमित अभिव्यक्ति बनाने में मदद करने के लिए नियमित अभिव्यक्ति और उपकरण की व्याख्या करने वाले इंटरनेट पर कई संसाधन हैं।

यह विषय Tcl में नियमित अभिव्यक्तियों के उपयोग के सामान्य स्विच और विधियों और Tcl और अन्य नियमित अभिव्यक्ति इंजनों के बीच कुछ अंतरों को कवर करने का प्रयास करेगा।

नियमित अभिव्यक्ति आम तौर पर धीमी होती है। पहला सवाल जो आपको पूछना चाहिए "क्या मुझे वास्तव में एक नियमित अभिव्यक्ति की आवश्यकता है?"। जो आप चाहते हैं, केवल उसी से मिलान करें। यदि आपको अन्य डेटा की आवश्यकता नहीं है, तो इसका मिलान न करें।

इन नियमित अभिव्यक्ति उदाहरणों के प्रयोजनों के लिए, इनकैंडेन्डेड स्विच का उपयोग नियमित अभिव्यक्ति को टिप्पणी करने और समझाने में सक्षम होने के लिए किया जाएगा।

मेल मिलाना

regexp कमांड का उपयोग स्ट्रिंग के खिलाफ एक नियमित अभिव्यक्ति से मेल खाने के लिए किया जाता है।

# This is a very simplistic e-mail matcher.
# e-mail addresses are extremely complicated to match properly.
# there is no guarantee that this regex will properly match e-mail addresses.
set mydata "send mail to [email protected] please"
regexp -expanded {
    \y           # word boundary
    [^@\s]+      # characters that are not an @ or a space character
    @            # a single @ sign
    [\w.-]+      # normal characters and dots and dash
    \.           # a dot character
    \w+          # normal characters.
    \y           # word boundary
    } $mydata emailaddr
puts $emailaddr
[email protected]

यदि मैच बनाया गया था या 0 (गलत) नहीं तो regexp कमांड 1 (असली) मान लौटाएगा।

set mydata "hello wrld, this is Tcl"
# faster would be to use: [string match *world* $mydata] 
if { [regexp {world} $mydata] } {
   puts "spelling correct"
} else {
   puts "typographical error"
}

कुछ डेटा में सभी अभिव्यक्तियों का मिलान करने के लिए, डेटा को वापस करने के लिए -all स्विच और -inline स्विच का उपयोग करें। ध्यान दें कि डिफ़ॉल्ट किसी भी अन्य डेटा की तरह नए सिरे से व्यवहार करना है।

# simplistic english ordinal word matcher.
set mydata {
    This is the first line.
    This is the second line.
    This is the third line.
    This is the fourth line.
    }
set mymatches [regexp -all -inline -expanded {
    \y                  # word boundary
    \w+                 # standard characters
    (?:st|nd|rd|th)     # ending in st, nd, rd or th
                        # The ?: operator is used here as we don't
                        # want to return the match specified inside
                        # the grouping () operator.
    \y                  # word boundary
    } $mydata]
puts $mymatches
first second third fourth
# if the ?: operator was not used, the data returned would be:
first st second nd third rd fourth th

न्यूलाइन हैंडलिंग

# find real numbers at the end of a line (fake data).
set mydata {
    White 0.87 percent saturation.
    Specular reflection: 0.995
    Blue 0.56 percent saturation.
    Specular reflection: 0.421
    }
# the -line switch will enable newline matching.
# without -line, the $ would match the end of the data.
set mymatches [regexp -line -all -inline -expanded {
    \y                  # word boundary
    \d\.\d+             # a real number
    $                   # at the end of a line.
    } $mydata]
puts $mymatches
0.995 0.421

यूनिकोड को किसी विशेष हैंडलिंग की आवश्यकता नहीं है।

% set mydata {123ÂÃÄÈ456}
123ÂÃÄÈ456
% regexp {[[:alpha:]]+} $mydata match
1
% puts $match
ÂÃÄÈ
% regexp {\w+} $mydata match
1
% puts $match
123ÂÃÄÈ456

प्रलेखन: regexp re_syntax

लालची और गैर-लालची मात्रा का मिश्रण

यदि आपके पास पहले क्वांटिफायर के रूप में एक लालची मैच है, तो पूरी आरई लालची होगी,

यदि आपके पास पहले मात्रात्मक के रूप में गैर-लालची मैच है, तो पूरी आरई गैर-लालची होगी।

set mydata {
    Device widget1: port: 156 alias: input2
    Device widget2: alias: input1 
    Device widget3: port: 238 alias: processor2
    Device widget4: alias: output2
    }
regexp {Device\s(\w+):\s(.*?)alias} $mydata alldata devname devdata
puts "$devname $devdata"
widget1 port: 156 alias: input2
regexp {Device\s(.*?):\s(.*?)alias} $mydata alldata devname devdata
puts "$devname $devdata" 
widget1 port: 156 

पहले मामले में, पहला \ w + लालची है, इसलिए सभी क्वांटिफायर को लालची और * के रूप में चिह्नित किया गया है? से अधिक मैचों की उम्मीद है।

दूसरे मामले में, पहला। * गैर-लालची है और सभी मात्रात्मक को गैर-लालची के रूप में चिह्नित किया गया है।

अन्य नियमित अभिव्यक्ति इंजनों में लालची / गैर-लालची मात्रा के साथ कोई समस्या नहीं हो सकती है, लेकिन वे बहुत धीमी हैं।

हेनरी स्पेंसर ने लिखा : ... परेशानी यह है कि उन बयानों के सामान्यीकरण को लिखना बहुत कठिन है, जो मिश्रित-लालची नियमित अभिव्यक्तियों को कवर करते हैं - मिश्रित-लालची नियमित अभिव्यक्तियों का एक उचित, कार्यान्वयन-स्वतंत्र परिभाषा से मेल खाना चाहिए - - और उन्हें "जो लोग उम्मीद करते हैं" करते हैं। मैंने कोशिश की। मैं अभी भी कोशिश कर रहा हूं। अब तक कोई भाग्य नहीं। ...

प्रतिस्थापन

regsub कमांड का उपयोग नियमित अभिव्यक्ति मिलान और प्रतिस्थापन के लिए किया जाता है।

set mydata {The yellow dog has the blues.}
# create a new string; only the first match is replaced.
set newdata [regsub {(yellow|blue)} $mydata green]
puts $newdata
The green dog has the blues.
# replace the data in the same string; all matches are replaced
regsub -all {(yellow|blue)} $mydata red mydata
puts $mydata
The red dog has the reds.
# another way to create a new string
regsub {(yellow|blue)} $mydata red mynewdata
puts $mynewdata
The red dog has the blues.

मिलान किए गए डेटा के संदर्भ में बैक-रेफरेंस का उपयोग करना।

set mydata {The yellow dog has the blues.}
regsub {(yellow)} $mydata {"\1"} mydata
puts $mydata
The "yellow" dog has the blues.

प्रलेखन: regsub re_syntax

Tcl के आरई इंजन और अन्य आरई इंजन के बीच अंतर।

  • \ m: एक शब्द की शुरुआत।
  • \ M: एक शब्द का अंत।
  • \ y: शब्द सीमा।
  • \ Y: एक बिंदु जो एक शब्द सीमा नहीं है।
  • \ Z: डेटा के अंत से मेल खाता है।

प्रलेखन: re_syntax

नियमित अभिव्यक्ति के साथ शाब्दिक स्ट्रिंग का मिलान करना

कभी-कभी आपको आरई मेटाचैटर्स युक्त प्रतिस्थापन के बावजूद एक नियमित अभिव्यक्ति के साथ एक शाब्दिक (उप-) स्ट्रिंग से मेल खाना चाहिए। हां, यह संभव है कि उस काम को करने के लिए उपयुक्त बैकस्लैश सम्मिलित करने के लिए कोड लिखना संभव हो ( string map का उपयोग करके) यह केवल ***= साथ पैटर्न को उपसर्ग करना सबसे आसान है, जो आरई इंजन को बाकी स्ट्रिंग को सिर्फ शाब्दिक वर्ण के रूप में मानता है। , आगे के सभी मेटाचैटर्स को निष्क्रिय कर रहा है।

set sampleText "This is some text with \[brackets\] in it."
set searchFor {[brackets]}

if {[ regexp ***=$searchFor $sampleText ]} {
    # This message will be printed
    puts "Found it!"
}

ध्यान दें कि इसका मतलब यह भी है कि आप किसी भी एंकर का उपयोग नहीं कर सकते।



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