2010-03-17 18 views
5

मैं एक स्ट्रिंग जो निम्न प्रारूप में पाठ शामिल बंटवारे के लिए एक समाधान की मांग कर रहा हूँ:मैं एक सिंगल उद्धृत स्ट्रिंग के अंदर तक एक स्ट्रिंग को व्हाइटस्पेस द्वारा कैसे विभाजित कर सकता हूं?

"abcd efgh 'ijklm no pqrs' tuv" 

निम्नलिखित परिणाम देगा जो:

['abcd', 'efgh', 'ijklm no pqrs', 'tuv'] 

दूसरे शब्दों में, यह खाली स्थान के जब तक द्वारा विभाजन एक उद्धृत स्ट्रिंग के अंदर। मुझे लगता है कि यह "लुकराउंड" ऑपरेटरों, विशेष रूप से संतुलित ऑपरेटरों का उपयोग कर .NET regexps के साथ किया जा सकता है। मैं पर्ल के बारे में इतना यकीन नहीं कर रहा हूँ।

उत्तर

15

उपयोग Text::ParseWords:

#!/usr/bin/perl 

use strict; use warnings; 
use Text::ParseWords; 

my @words = parse_line('\s+', 0, "abcd efgh 'ijklm no pqrs' tuv"); 

use Data::Dumper; 
print Dumper \@words; 

आउटपुट:

C:\Temp> ff 
$VAR1 = [ 
      'abcd', 
      'efgh', 
      'ijklm no pqrs', 
      'tuv' 
     ];

आप Text::ParseWords::parse_line के लिए स्रोत कोड का इस्तेमाल किया पैटर्न को देखने के लिए देख सकते हैं।

+1

मुझे प्यार है कि "मैं यह कैसे कर सकता हूं?" प्रश्न मैंने कभी पर्ल के बारे में कभी जवाब दिया है "इस मॉड्यूल का उपयोग करें जो वास्तव में आप चाहते हैं।" – jergason

+0

आंकड़े एक बिल्कुल पैकेज करने के लिए एक पैकेज है जो मुझे चाहिए। मुझे यकीन नहीं था कि मैं क्या देख रहा था। आप एक रॉक स्टार हैं, धन्यवाद! – Kivin

+5

@ जेर्जसन ने उन अद्भुत लोगों पर दोष दिया, जब वे * उन्हें बिल्कुल सही नहीं पाते हैं, और उन्हें स्वयं लिखना है, परिणामस्वरूप सीपीएएन परिणाम। :) – hobbs

2

तो आपने रेगेक्स का उपयोग करने का निर्णय लिया है? अब आपके पास दो समस्याएं हैं।

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

दूसरे शब्दों में, आप एक कमांड लाइन खोल करना चाहते हैं। आपको वास्तव में कुछ का पुन: उपयोग करना चाहिए। उसमें असफल होने पर आप एक समय में एक क्षेत्र पर कब्जा करना चाहिए की तरह एक regex कुछ के साथ,:,

^ *([^ ]+|'[^']*')(.*) 

कहाँ आप अपनी सूची में समूह एक संलग्न करें और समूह 2.

एक की सामग्री के साथ पाश जारी रखने के लिए एक रेगेक्स के माध्यम से एकल पास एक मनमाने ढंग से बड़ी संख्या में खेतों को पकड़ने में सक्षम नहीं होगा। आप एक रेगेक्स पर विभाजित करने में सक्षम हो सकते हैं (पायथन यह करेगा, पर्ल के बारे में निश्चित नहीं है), लेकिन चूंकि आप रिक्त स्थान के बाहर की सामग्री से मेल खाते हैं, मुझे यकीन नहीं है कि यह एक विकल्प भी है।

3
use strict; use warnings; 

my $text = "abcd efgh 'ijklm no pqrs' tuv 'xwyz 1234 9999' 'blah'"; 
my @out; 

my @parts = split /'/, $text; 

for (my $i = 1; $i < $#parts; $i += 2) { 
    push @out, split(/\s+/, $parts[$i - 1]), $parts[$i]; 
} 

push @out, $parts[-1]; 

use Data::Dumper; 
print Dumper \@out; 
संबंधित मुद्दे

 संबंधित मुद्दे