2009-03-09 11 views
5

मैं एक पर्ल रेगेक्स की तलाश में हूं जो व्हाइटस्पेस (या स्ट्रिंग में पहला char) से पहले किसी भी चरित्र को कैपिटल करता है।व्हाइटस्पेस के बाद किसी भी अक्षरों को कैजेट करेगा?

मैं बहुत यकीन है कि वहाँ यह करने के लिए एक आसान तरीका है हूँ, लेकिन मैं अपने पर्ल पुस्तक आसान नहीं है और मैं इस अक्सर पर्याप्त है कि मैं इसे याद किया है ऐसा नहीं करते हैं ...

+0

आप क्या करने की कोशिश कर रहे हैं? यदि आप चीजों का शीर्षक केस बनाने की कोशिश कर रहे हैं? इसके लिए एक perlfaq है। –

+0

एसओ पर पूछना तेज़ है, और मुझे यकीन है कि यह Google इंडेक्स के बाद दुनिया में किसी और को लाभ पहुंचाएगा। मैं अक्सर पीएलएल का उपयोग नहीं करता हूं कि मैं उन सभी छोटी चालों को याद कर सकता हूं जिन्हें मैं – Kip

उत्तर

8

आपकी सटीक समस्या के आधार पर, यह आपके विचार से कहीं अधिक जटिल हो सकता है और एक साधारण रेगेक्स काम नहीं कर सकता है। क्या आपने शब्द के अंदर पूंजीकरण के बारे में सोचा है? क्या होगा यदि शब्द विराम चिह्न से शुरू होता है जैसे '... शब्द'? क्या कोई अपवाद है? अंतरराष्ट्रीय पात्रों के बारे में क्या?

यह Text::Autoformat या Text::Capitalize जहां इन समस्याओं को पहले से ही सुलझाई जा सकती तरह एक CPAN मॉड्यूल का उपयोग करने के लिए बेहतर हो सकता है।

use Text::Capitalize 0.2; 
print capitalize_title($t), "\n"; 

use Text::Autoformat; 
print autoformat{case => "highlight", right=>length($t)}, $t; 

यह पाठ की तरह लगता है :: Autoformat अधिक "मानक" हो सकता है और मुझे लगता है कि पहले की कोशिश करेंगे। यह Damian द्वारा लिखा गया है। लेकिन पाठ :: पूंजीकरण कुछ चीजें करता है जो टेक्स्ट :: ऑटोफॉर्मेट नहीं करता है। यहां एक comparison है।

आप व्यंजन 1.14 (पृष्ठ 31) के लिए Perl Cookbook को भी देख सकते हैं कि रीजिक्स का उपयोग किसी शीर्षक या शीर्षक को सही ढंग से कैपिटल करने के लिए कैसे करें।

+0

विराम चिह्न एक संभावित मुद्दा होने के बारे में यह एक अच्छा मुद्दा है। –

+0

धन्यवाद, यह काफी उपयोगी है – Kip

10
s/(\s\w)/\U$1\E/g; 

मैं मूल रूप से सुझाव:

s/\s\w/\U$&\E/g; 

लेकिन अलार्म की घंटी '$&' (यहां तक ​​कि इससे पहले कि मैं पढ़ @ Manni की टिप्पणी) के उपयोग पर उतर जा रहे थे। यह पता चला है कि वे पूरी तरह से उचित हैं - $ & का उपयोग करके, $ `और $ 'संचालन regexes में एक समग्र अक्षमता का कारण बनता है।

इस रेगेक्स के लिए \ E महत्वपूर्ण नहीं है; यह इस मामले में 'केस-सेटिंग' स्विच \U या निचले मामले के लिए \L को बंद कर देता है।


टिप्पणी में बताया गया है, स्ट्रिंग के प्रथम वर्ण से मेल खाते के रूप में की आवश्यकता है:

s/((?:^|\s)\w)/\U$1\E/g; 

दूसरा पास कोष्ठक की सही स्थिति - धन्यवाद, Blixtor। स्ट्रिंग की खाली/शुरू करने के लिए $ 1 और शब्द के पहले अक्षर के लिए $ 2 - दो मैचों में

s!(^|\s)(\w)!$1\U$2!g 

यह केवल स्कैन किया अभिव्यक्ति अप विभाजन -

+0

जानता था, आप स्ट्रिंग के पहले चार को भूल गए थे: s/(\ s | ^) \ w/\ U $ &\E/g; – Node

+0

मैंने कभी नहीं किया है इस तरह एक regex देखा - क्या आप इसे समझा सकते हैं? –

+0

$ और? "कार्यक्रम में कहीं भी इस चर का उपयोग सभी नियमित अभिव्यक्ति मैचों पर एक महत्वपूर्ण प्रदर्शन जुर्माना लगाता है।" – innaM

7

कुछ इस तरह चाल करना चाहिए। हम ऊपरी मामले के शब्द को शुरू करने के बाद $ 1 और $ 2 दोनों को प्रतिस्थापित करते हैं।

मैं \ b को \ b में बदल दूंगा जो अधिक समझ में आता है क्योंकि हम यहां शब्द-सीमाओं की जांच कर रहे हैं।

0

आप व्हाइटस्पेस के पीछे अक्षरों से मेल खाते हैं, या स्ट्रिंग की शुरुआत में।

पर्ल चर लंबाई लंबाई नहीं कर सकता है।

s/(?<=\s|^)(\w)/\u$1/g; # this does not work! 

पर्ल की शिकायत:: यदि ऐसा किया, तो आप इस के लिए इस्तेमाल किया जा सकता था

Variable length lookbehind not implemented in regex; 

आपको लगता है कि चारों ओर पाने के लिए डबल नकारात्मक lookbehind उपयोग कर सकते हैं: इसके बारे में बाईं तरफ बात कुछ भी नहीं होना चाहिए कि सफेद जगह नहीं है। इसका मतलब है कि यह स्ट्रिंग की शुरुआत में मेल खाता है, लेकिन यदि इसके सामने कुछ भी है, तो यह सफेद जगह होना चाहिए।

s/(?<!\S)(\w)/\u$1/g; 

इस सटीक मामले में सरल दृष्टिकोण शायद व्हाइटस्पेस से मेल खाना होगा; परिवर्तनीय लंबाई प्रतिबंध दूर गिर जाता है, और, उस प्रतिस्थापन में शामिल हैं।

s/(\s|^)(\w)/$1\u$2/g; 

कभी कभी आपको बार-बार प्रतिस्थापन में इस दृष्टिकोण का उपयोग नहीं कर सकते हैं क्योंकि यह है कि क्या वास्तविक मैच के पहले आता है पहले से ही रेगुलर एक्सप्रेशन द्वारा खाया गया है, और यह है कि चारों ओर एक रास्ता है करने के लिए अच्छा है।

+0

आप सही हैं कि '/ (? <= \ S | ^) (\ w) /' काम नहीं करता है, लेकिन ध्यान दें कि '/ (?: (? <= \ S) | ^) (\ डब्ल्यू)/'एक समकक्ष विकल्प है जो काम करता है। –

1

यह कुछ मैं सामान्य रूप से करने के लिए एक regex का उपयोग होता नहीं है, लेकिन मेरी समाधान बिल्कुल नहीं है कि तुम क्या कहते हैं "सुंदर" होगा:

$string = join("", map(ucfirst, split(/(\s+)/, $string))); 

कि split() रों खाली स्थान के द्वारा स्ट्रिंग और सभी कब्जा व्हाइटस्पेस, फिर सूची के प्रत्येक तत्व के माध्यम से जाता है और ucfirst उन पर (पहला अक्षर अपरकेस बना देता है), फिर join() उन्हें एक स्ट्रिंग के रूप में एक साथ वापस ले जाता है। भयानक नहीं है, लेकिन शायद आप एक regex अधिक पसंद करेंगे। मैं व्यक्तिगत रूप से \Q या \U या अन्य अर्ध-अजीब रेगेक्स संरचनाओं को पसंद नहीं करता हूं।

संपादित करें: किसी और ने उल्लेख किया है कि विराम चिह्न एक संभावित मुद्दा हो सकता है। हैं, कहते हैं, तो आप इस हैं:

...string 

यह करने के लिए बदल दिया है:

$string = join("", map(ucfirst, split(/(\w+)/, $string))); 
:

...String 

यानी आप चाहते हैं शब्द बड़े अक्षरों में उन्हें पहले विराम चिह्न नहीं है, भले ही कुछ इस तरह अधिक की कोशिश

वही बात है, लेकिन यह split() एस शब्दों पर है (\w+) ताकि सूची के कब्जे वाले तत्व केवल शब्द ही हों। वही समग्र प्रभाव, लेकिन उन शब्दों को कैपिटल करना होगा जो शब्द वर्ण से शुरू नहीं हो सकते हैं। संख्याओं को पूंजीकृत करने की कोशिश को खत्म करने के लिए \w[a-zA-Z] बदलें। और आमतौर पर इसे पसंद करते हैं, हालांकि आप इसे पसंद करते हैं।

+0

@ वोलोमाइक - पर्ल का क्या संस्करण आप उपयोग कर रहे हैं? –

+0

ओह शूट। वह पर्ल था? मेरी गलती! :) मैं अपनी टिप्पणी हटा दूंगा। मैंने सोचा कि यह PHP था। – Volomike

1

यदि आपका मतलब अंतरिक्ष के बाद चरित्र है, \s का उपयोग करके नियमित अभिव्यक्तियों का उपयोग करें। यदि आप वास्तव में शब्द में पहले अक्षर का मतलब रखते हैं तो आपको के साथ सभी उपरोक्त प्रयासों के बजाय \b का उपयोग करना चाहिए जो त्रुटि प्रवण है।

s/(^|\s)./\u$1/g 

हो सकता है कि यह कर, क्योंकि यह भी अब खाली स्थान के uppercasing है की एक बहुत ही खराब रास्ता:

s/\b(\w)/\U$1/g; 
+0

प्रतीक्षा करें ... \ s त्रुटि प्रवण है? समझाओ कि आपका क्या मतलब है और इसका मतलब क्यों है। –

+0

\ s त्रुटि-प्रवण नहीं है अगर आवश्यकताएं व्हाइटस्पेस के बाद वाले अपरकेस चीजों को कहती हैं। \ बी भी एक समस्या है। एक उदाहरण के लिए चीजें शीर्षक केस बनाने पर perlfaq देखें। –

+0

शब्द हमेशा अंतरिक्ष के बाद शुरू नहीं होते हैं। उदाहरण के लिए: 'लेवेनबर्ग - मार्वार्ड एल्गोरिदम'। दो शब्द हैं जो अंतरिक्ष के बाद शुरू नहीं होते हैं, न ही लेवेनबर्ग और न ही मार्वार्ड। –

0

किसी भी चरित्र खाली स्थान के द्वारा या स्ट्रिंग की शुरुआत में पहले कैपिटल में लिखें।: पी लाभ यह है कि यह सभी संभावित उच्चारण (और विशेष डेनिश/स्वीडिश/नॉर्वेजियन अक्षरों के साथ) के साथ अक्षरों के साथ काम करता है, जो आपके रेगेक्स में \ w और \ b का उपयोग करते समय समस्याग्रस्त होते हैं। क्या मैं उम्मीद कर सकता हूं कि सभी गैर अक्षरों को अपरकेस संशोधक द्वारा छेड़छाड़ की जाती है?

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