2012-04-25 8 views
52

में कैमेलकेज़ को कैमेलकैज़ में परिवर्तित करने के लिए रेगेक्स मुझे समझ में आता है कि रेगेक्स का उपयोग करके कनवर्ट करने के लिए वांछित आउटपुट क्यों नहीं दिया जाता है जैसे FooBar से Foo_Bar जो Foo_Bar_ देता है। मैं String.substring substring(0, string.length() - 2) के साथ कुछ कर सकता था या सिर्फ अंतिम चरित्र को प्रतिस्थापित कर सकता था, लेकिन मुझे लगता है कि इस तरह के परिदृश्य के लिए एक बेहतर समाधान है।जावा

String regex = "([A-Z][a-z]+)"; 
String replacement = "$1_"; 

"CamelCaseToSomethingElse".replaceAll(regex, replacement); 

/* 
outputs: Camel_Case_To_Something_Else_ 
desired output: Camel_Case_To_Something_Else 
*/ 

प्रश्न:: एक neater तरीका वांछित आउटपुट प्राप्त करने के लिए खोज रहे

यहाँ कोड है?

+0

यह सवाल http के समान है: // stackoverflow।कॉम/प्रश्न/48860 9 1/डालने-स्थान-बाद-पूंजी-पत्र –

उत्तर

99

कुछ की तरह अपने मामले में इस question और CaseFormat from guava

देखें। पॉजिटिव लुकहेड एक लेटर लेटर के साथ शुरू होने वाले दूसरे शब्द की तलाश करेगा जिसके बाद लोअरकेस अक्षरों के बाद यह मैच में शामिल नहीं होगा।

यहाँ देखो:

String replaceAll = key.replaceAll("(.)(\\p{Upper})", "$1_$2").toLowerCase(); 
+0

@eliocs सवाल एंड्रॉयड टैग किया गया था नहीं और "neater तरीका" .. downvote के लिए धन्यवाद वैसे भी;) –

+1

CaseFormat लिंक ऑफ़लाइन है। रिप्लेसमेंट है [यहां] (https://github.com/google/guava/blob/master/guava/src/com/google/common/base/CaseFormat.java) – Anticom

+0

@Anticom, संपादित; धन्यवाद :) –

2

एक शून्य चौड़ाई अग्रदर्शी अभिकथन जोड़ें।

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

(?=X) आदि

निजी तौर पर के लिए दस्तावेज़ पढ़ें, मैं वास्तव में विभाजित हैं स्ट्रिंग, तो यह पुनः संयोजित। यह सही होने पर भी तेज़ हो सकता है, और यह नियमित अभिव्यक्ति जादू से कोड को समझना बहुत आसान बनाता है। मुझे गलत मत समझो: मुझे नियमित अभिव्यक्ति पसंद है। लेकिन यह वास्तव में एक स्वच्छ रेगुलर एक्सप्रेशन नहीं है, और न ही इस परिवर्तन एक क्लासिक regexp काम है। ऐसा लगता है कि आप लोअरकेस भी करना चाहते हैं?

एक बदसूरत लेकिन त्वरित हैक $1_$2 साथ (.)([A-Z]+) को बदलने के लिए किया जाएगा और फिर बाद में पूरी स्ट्रिंग लोअरकेस (जब तक आप पर्ल शैली extrended regexps है, जहां आप प्रतिस्थापन सीधे लोअरकेस कर सकते हैं कर सकते हैं!)। फिर भी मैं निचले-से-ऊपरी संक्रमण पर विभाजन करने पर विचार करता हूं, फिर इसे बदलता हूं, फिर इसे करने के उचित और सबसे पठनीय तरीके से जुड़ता हूं।

CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "SomeInput"); 
+0

हां, आखिरकार मैं इसे कम मामले में भी रखना चाहता हूं। – ajmartin

+0

तो मैं इसे '[ए-जेड] [ए-जेड] * 'से मिलान करने वाले हिस्सों में विभाजित कर दूंगा, पहले अक्षर को लोअरकेस कर दूंगा, और उनसे जुड़ जाऊंगा। या प्रतिस्थापन + लोअरकेस चाल मैंने अभी मुख्य जवाब में जोड़ा है। –

1
([A-Z][a-z\d]+)(?=([A-Z][a-z\d]+)) 

छोटे अक्षरों के बाद बड़े अक्षर के लिए खोज करना चाहिए:

46

बाँध छोटे अक्षर और दो समूह के रूप में अपर केस, यह ठीक

public class Main 
{ 
    public static void main(String args[]) 
    { 
     String regex = "([a-z])([A-Z]+)"; 
     String replacement = "$1_$2"; 
     System.out.println("CamelCaseToSomethingElse" 
          .replaceAll(regex, replacement) 
          .toLowerCase()); 
    } 
} 
22

आप कोड का टुकड़ा नीचे का उपयोग कर सकते हो जाएगा बस $ लाइन की शुरुआत के रूप में पूर्व चरित्र से मेल खाते हैं?

String text = "CamelCaseToSomethingElse"; 
System.out.println(text.replaceAll("([^_A-Z])([A-Z])", "$1_$2")); 

ध्यान दें कि यह संस्करण पहले से ही ऊंट के पहले किए गए किसी भी चीज़ पर किया जा सकता है।

+0

Slick एएफ। अच्छी तरह से किया! –

+0

क्या होगा यदि मेरी स्ट्रिंग में एक संख्या - मोड 3 मोड 3 के रूप में समाप्त होता है, जबकि मैं मोड_3 चाहता हूं। –

3

क्यों नहीं: http://regexr.com?30ooo

+0

क्या आप एंकर के रूप में '^' और '$' का उपयोग करने का प्रयास कर रहे हैं? क्योंकि जब आप उन्हें एक चरित्र वर्ग में डालते हैं तो उनका अर्थ बदल जाता है। '[^ $ _ ए-जेड] 'किसी भी चरित्र से मेल खाता है जो' $', '_', या अपरकेस अक्षर नहीं है, और मुझे नहीं लगता कि आपका मतलब यही है। –

+0

एंकरों के रूप में नहीं आ रहा है, मैं ऊपरी चरित्र से मेल नहीं करने का प्रयास कर रहा हूं, '$ 'को गलती से जोड़ा गया क्योंकि यह एक तकनीक है जिसे मैं कक्षा-नामों पर उपयोग करता हूं। –

0
public class ReplaceFromCameltoSnake { 
    public static void main(String args[]){ 
     String s1=" totalAmountWithoutDiscount"; 
     String replaceString=s1.replaceAll("([A-Z]+)","\\_$1").toLowerCase(); 
     System.out.println(replaceString); 
    } 
} 
+0

$ 1-समूह बनाने के लिए उपयोग किया जाता है –

+0

कोड पोस्ट न करें, एक स्पष्टीकरण जोड़ें। – reformed