2011-04-04 17 views
5

गाह, रेगेक्स थोड़ा उलझन में है।यदि स्ट्रिंग में विराम चिह्न है तो मैं स्ट्रिंग से अंतिम वर्ण को कैसे हटा सकता हूं?

मैं एक स्ट्रिंग के अंत में सभी संभव विराम चिह्न वर्ण दूर करने के लिए कोशिश कर रहा हूँ:

if str[str.length-1] == '?' || str[str.length-1] == '.' || str[str.length-1] == '!' or str[str.length-1] == ',' || str[str.length-1] == ';' 
    str.chomp! 
end 

मैं वहाँ यह करने के लिए एक बेहतर तरीका है यकीन है। कोई संकेतक?

+3

केवल _slightly?! _ 8 ^) – ridgerunner

+0

कृपया स्पष्ट करें कि '#', '@', '-', '_' जैसे वर्ण निकालने के लिए आपकी सूची में विराम चिह्न के रूप में योग्य हैं या नहीं। कैसा रहेगा ':'? –

+0

अभी तक, केवल वे जिन्हें मैंने सूचीबद्ध किया था। मेरा मानना ​​है: punct: आपके द्वारा उल्लेख किए गए बाकी हिस्सों को शामिल किया गया है, लेकिन मुझे केवल ऊपर वर्णित वर्णों को हटाने में दिलचस्पी थी। – oxo

उत्तर

7
str.sub!(/[?.!,;]?$/, '') 
  • [?.!,;] - वर्ण वर्ग। उन 5 अक्षर (ध्यान दें, . एक चरित्र वर्ग में विशेष नहीं है)
  • ? से भी मेल खाता - पिछला चरित्र या समूह वैकल्पिक
  • $ है - स्ट्रिंग की समाप्ति।

यह मूल स्ट्रिंग के साथ स्ट्रिंग के अंत में एक वैकल्पिक विराम चिह्न चरित्र को मूल रूप से बदल देता है। यदि चरित्र विराम चिह्न नहीं है, तो यह एक नो-ऑप है।

+0

सरल प्रश्न: str.sub! (/ [?।!,;]] $ /, '') पर्याप्त है (और जगह में स्ट्र को संशोधित करें) या मुझे str = str.sub सेट करना होगा! (/ [?. !,;]? $ /, '' 'इसके बजाए? – oxo

+1

चूंकि यह 'उप! 'का उपयोग कर रहा है, यह स्ट्रिंग को जगह में बदल देगा। –

0

सभी गैर-शब्द वर्ण।

text.gsub(/\W$/, "")

क्या करता है करता है, स्ट्रिंग पर लग रहा है अंत में विराम चिह्न पाता है, और दुनिया भर में इस प्रकार इसे हटाने = कुछ भी नहीं के साथ विकल्प।

यह वास्तव में काम करता है, और यह रेगेक्स का उपयोग करने के लिए एक रूबी तरीका है।

+0

वह रेगेक्स जो उसने पूछा उससे बिल्कुल अलग है। और यह मौजूदा एक को संशोधित करने के बजाय, एक नई स्ट्रिंग देता है। –

+0

यहां आपके रेगेक्स आउट का परीक्षण करने का एक सहायक तरीका है। [लिंक] (http://www.rubular.com/) – Ray301

+0

रॉकटेस्ट की तरह, यह रिक्त स्थान के साथ-साथ विराम चिह्न भी मेल खाता है। –

0

आपको ऐसा करने के लिए नियमित अभिव्यक्ति का उपयोग करने में सक्षम होना चाहिए। मैं रूबी के साथ कोई अनुभव नहीं है, लेकिन यहां एक रेगुलर एक्सप्रेशन से वह काम कर सकता है:

/(.*)[^\w\d]?$/ 

आप backreference # 1 का उपयोग पिछले विराम वर्ण के बिना स्ट्रिंग प्राप्त करने के लिए कर सकते हैं।

+0

वह रेगेक्स वह नहीं है जिसे उसने पूछा था। ऐसे कई अन्य पात्र हैं जो आपके साथ मेल खाते हैं, '@' केवल एक ही है। –

+0

'@' विराम चिह्न है ... और मुझे लगता है कि आप [डाउनवोट] (http://stackoverflow.com/privileges/vote-down) विशेषाधिकार का दुरुपयोग कर रहे हैं। कृपया बताएं कि यह पोस्ट "गंभीर रूप से मैला, कोई प्रयास नहीं किया गया पोस्ट, या एक उत्तर जो स्पष्ट रूप से और शायद खतरनाक रूप से गलत है" – rockerest

+0

@ रोकेस्ट, "उन्होंने कहा कि वह अपने मौजूदा कोड के बेहतर समकक्ष चाहते हैं। 2. आपका टैब जैसी चीजों से भी मेल खाता है, जो निश्चित रूप से विराम चिह्न नहीं है। –

0
mystring.gsub(/[[:punct:]]+$/,"") 
+0

यह एक या एक से अधिक चरित्र करता है, और पंच सूचीबद्ध 5 से अधिक मिलान करता है। –

+0

हालांकि यह वही नहीं है जो मुझे चाहिए (इस समय), धन्यवाद: punct: - मुझे इसके बारे में पता नहीं था। यह सभी पंकट मैच क्या मेल खाते हैं? – oxo

2

मूल प्रश्न 'कहा गया है एक स्ट्रिंग के अंत में सभी संभव विराम चिह्न वर्ण निकालें, "लेकिन उदाहरण केवल उल्लेख से पता चला है 5,"? ","। ","! ",", "" , "इस तरह के रूप मुमकिन अन्य विराम चिह्न।": punct: चरित्र वर्ग के रूप में Kurumi से कहा: ", '"', आदि में शामिल किया जाना चाहिए "सभी संभव विराम चिह्न वर्ण," इसलिए का उपयोग

str.sub!(/[[:punct:]]?$/,'') 
0

खाली स्ट्रिंग का उपयोग किए बिना:

str = /[?.!,;]?\z/.match(str).pre_match 

या अन्य आदेश में

str = str.match(/[?.!,;]?\z/).pre_match 
0

str.chomp! इस मामले में कुछ नहीं करेंगे। आपको str.chop!

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