मैं रेगेक्स का उपयोग करने के तरीके पर पूरी तरह से अनजान हूं और उपरोक्त समस्या पर कुछ मदद की ज़रूरत है। मुझे <> को नई लाइनों से बदलना है लेकिन स्ट्रिंग को <> के बीच रखना है। इसलिए

<'sample text'><'sample text 2'>

हो जाता है

'sample text'
'sample text2'
1
Adlis 2 फरवरी 2017, 22:02
1
आप किस भाषा का उपयोग कर रहे हैं? साथ ही, क्या आपको पहले < और अंतिम > के लिए नई लाइन चाहिए?
 – 
Niitaku
2 फरवरी 2017, 22:04
बस >< को एक नई लाइन से बदलें, किसी रेगुलर एक्सप्रेशन की आवश्यकता नहीं है।
 – 
Barmar
2 फरवरी 2017, 22:04
अन्य भागों के नियमित अभिव्यक्ति प्रतिस्थापन करते समय स्ट्रिंग के हिस्सों को कैसे रखा जाए, इसके बारे में सामान्य उत्तर उन हिस्सों के लिए कैप्चर समूह का उपयोग करना है, और प्रतिस्थापन में बैक-रेफरेंस का उपयोग करना है।
 – 
Barmar
2 फरवरी 2017, 22:05
इस इनपुट के लिए परिणाम कैसा दिखना चाहिए <'sample text'> <'sample text 2'> some text <'sample text 3'> <> ?
 – 
RomanPerekhrest
2 फरवरी 2017, 22:12
Niitaku के लिए इसके पॉवरशेल का उपयोग करना और <> के पहले और अंतिम समूह में नई लाइनें नहीं होनी चाहिए। बरमार के लिए मैं कोशिश करूँगा और देखूंगा कि यह उस टेक्स्ट फ़ाइल के साथ काम करता है जिसका मैं उपयोग कर रहा हूं। RomanPerekhrest यह 'नमूना पाठ' नई पंक्ति'नमूना पाठ 2' कुछ पाठ नई पंक्ति'नमूना पाठ 3' नई पंक्ति"खाली जैसा दिखना चाहिए रेखा"
 – 
Adlis
2 फरवरी 2017, 22:19

3 जवाब

सबसे बढ़िया उत्तर
\<([^>]*)\>

यह रेगेक्स < और > के बीच के टेक्स्ट को कैप्चर समूहों में कैप्चर करेगा, जिसे आप फिर से संदर्भित कर सकते हैं और उनके बीच एक नई लाइन डाल सकते हैं।

\1\n

इसे यहां देखें।

संपादित करें:

पावरशेल में

PS C:\Users\shtabriz> $string = "<'sample text'><'sample text 2'>"
PS C:\Users\shtabriz> $regex = "\<([^>]*)\>"
PS C:\Users\shtabriz> [regex]::Replace($string, $regex, '$1'+"`n")
'sample text'
'sample text 2'
2
Shawn Tabrizi 2 फरवरी 2017, 23:17

यह मेरे लिए टेक्स्टपैड में काम करता है:

उदाहरण:

डोरी:

" 1) रिकॉर्ड करने के लिए नेविगेट करें। 2) टैब पर नेविगेट करें और चुनें। 3) फ़ील्ड पर क्लिक करें। 4) टैब पर क्लिक करें और स्क्रॉल करें।

नोट: खोज/प्रतिस्थापन झटका के लिए, उद्धरण शामिल न करें, मैंने उनका उपयोग खोज शब्द में एक स्थान की उपस्थिति दिखाने के लिए किया था

खोजें: "[0-9]+) " बदलें: "\n$0"

परिणामी स्ट्रिंग:

  1. रिकॉर्ड करने के लिए नेविगेट करें।
  2. टैब पर नेविगेट करें और चुनें।
  3. फ़ील्ड पर क्लिक करें.
  4. टैब पर क्लिक करें और स्क्रॉल करें।

(नोट... स्टैकओवरफ्लो ने मेरे ")" को "।" में बदल दिया)

0
ckirkwood9 24 फरवरी 2021, 20:24

Shawn Tabrizi's उपयोगी उत्तर को और अधिक PowerShell-idiomatic Solution और कुछ पृष्ठभूमि जानकारी के साथ पूरक करने के लिए:

पावरशेल .NET System.Text.RegularExpressions.Regex.Replace() विधि ([regex]::Replace(), PowerShell से) अपने स्वयं के -replace ऑपरेटर

सबसे संक्षिप्त समाधान (लेकिन संभावित नुकसान के लिए नीचे देखें):

# Note the escaped "$" ("`$")
"<'sample text'><'sample text 2'>" -replace '<(.*?)>', "`$1`n"

आउटपुट:

'sample text'
'sample text 2'
  • $1 क्रमांकित कैप्चर-ग्रुप प्रतिस्थापन, रेगेक्स ((...)) के अंदर पहला (और केवल) कैप्चर समूह, जो कि स्ट्रिंग्स हैं, का जिक्र करते हुए < और > (.*? के बीच एक गैर लालची अभिव्यक्ति है जो किसी भी वर्ण से मेल खाती है लेकिन अगले निर्माण के बाद रुक जाती है, > में इस मामले में पाया जाता है।)

    • हालांकि, एक डबल-उद्धृत स्ट्रिंग ("...") के अंदर, जिसे विस्तार योग्य स्ट्रिंग, $1 की व्याख्या पॉवरशेल चर संदर्भ के रूप में की जाएगी, इसलिए बैकटिक (`), पॉवरशेल के सामान्य एस्केप कैरेक्टर: "`$1"

      $ वर्ण को बच निकला होना चाहिए: "`$1"

    • इसके विपरीत, यदि आप चाहते हैं कि .NET API प्रतिस्थापन स्ट्रिंग में किसी $ वर्ण की व्याख्या न करे, तो $$ का उपयोग करें (या तो $$ अंदर '...', या "`$`$" अंदर "...") - लेकिन ध्यान दें कि regex के अंदर एक शब्दशः $ होना चाहिए \$ के रूप में बच निकले।

  • "`n" एक पॉवरशेल एस्केप सीक्वेंस है जिसे एक्सपेंडेबल स्ट्रिंग्स (केवल) के अंदर इस्तेमाल किया जा सकता है - वैचारिक about_Special_Characters सहायता विषय।

चेतावनी:

  • यहां सुविधाजनक होने पर, विस्तार योग्य स्ट्रिंग्स को रेगेक्स और प्रतिस्थापन ऑपरेंड के रूप में उपयोग करने के संबंध में नुकसान हैं, क्योंकि यह हमेशा स्पष्ट नहीं होता है कि पावरशेल क्या विस्तार (इंटरपोलेट) करता है, और परिणाम के रूप में .NET API क्या देखता है।

  • इसलिए, आमतौर पर एकल-उद्धृत स्ट्रिंग्स ('...', जिसे वर्बैटिम स्ट्रिंग्स के रूप में भी जाना जाता है) का उपयोग करना बेहतर होता है - दोनों के लिए प्रतिस्थापन संकार्य और स्वयं रेगेक्स, और - यदि आवश्यक हो - समग्र स्ट्रिंग बनाने के लिए एक अभिव्यक्ति ((...)) का उपयोग करें, जो आपको शब्दशः (पास-थ्रू) भागों को प्रक्षेपित से अलग करने की अनुमति देता है भागों।

शॉन ने अपने उत्तर में यही किया; -replace ऑपरेशन में अनुवादित:

# Note the expression used to build the substitution string
# from a verbatim ('...') and an interpolated ("...") part.
"<'sample text'><'sample text 2'>" -replace '<(.*?)>', ('${1}' + "`n")

एक अन्य विकल्प, -f का उपयोग करते हुए, फ़ॉर्मेट ऑपरेटर:

"<'sample text'><'sample text 2'>" -replace '<(.*?)>', ("{0}`n" -f '${1}')

केवल $1 के बजाय ${1} के उपयोग पर ध्यान दें: संदर्भित कैप्चर समूह की संख्या / नाम को {...} में संलग्न करना असंबद्ध em> इसे अनुसरण करने वाले पात्रों से, जो एक और नुकसान से बचा जाता है, जैसा कि निम्न उदाहरण दिखाता है (संयोग से, PowerShell के स्वयं के चर संदर्भों को उसी तरह से स्पष्ट किया जा सकता है):

# FAILS and results in 'f$142', because the .NET API sees
# '$142' as the substitution string, and there is no 142nd capture group.
$suffix = '42'; 'foo' -replace '(oo)', ('$1' + $suffix)

# OK, with disambiguation via {...} -> 'foo42'
$suffix = '42'; 'foo' -replace '(oo)', ('${1}' + $suffix)
0
mklement0 23 सितंबर 2021, 20:40