2012-10-05 13 views
5

कोड कोडिंग टूल के लिए मैं काम कर रहा हूं, मुझे स्ट्रिंग लेने और इसे वैध जावा वैरिएबल नाम जेनरेट करने की आवश्यकता है, लेकिन मुझे यह करने का सबसे अच्छा तरीका नहीं है ।स्ट्रिंग को वैध जावा वैरिएबल नाम में कनवर्ट करें

उदाहरण के लिए:

"123 this is some message !" =>_123_this_is_some_message (या कुछ इसी तरह)

धन्यवाद

+2

इनपुट स्ट्रिंग की संभावित सामग्री क्या हैं? बस अल्फान्यूमेरिक्स, विराम चिह्न और रिक्त स्थान? यूनिकोड में सबकुछ? – Pops

+0

इनपुट पर नियम लागू किए बिना, मुझे लगता है कि आपको टकराव मिलेगा (यानी कई से एक मैपिंग)। आपके आवेदन के आधार पर, इससे कोई फर्क नहीं पड़ता या इससे कोई फर्क नहीं पड़ता। – jpm

+0

यदि आप जावा परिवर्तनीय नाम के लिए एक वैध वर्ण है तो आप स्ट्रिंग के माध्यम से लूपिंग और स्ट्रिंगबिल्डर में शामिल होने का प्रयास कर सकते हैं। आपके पास जो चुनौती हो सकती है वह डुप्लिकेट वैरिएबल है, इसलिए हो सकता है कि आप जो भी इस्तेमाल करते हैं उसका ट्रैक रखें और यदि आवश्यक हो तो संख्याएं संलग्न करें। – JustinKSU

उत्तर

7

मान लें कि आप सभी अमान्य वर्णों को _ द्वारा प्रतिस्थापित कर सकते हैं जैसे कि नीचे दिया गया कोड काम कर सकता है (मोटा उदाहरण)। आप यह आधारित है on the JLS #3.8 नाम टकराव आदि के लिए कुछ तर्क जोड़ सकते हैं:

एक पहचानकर्ता जावा पत्र और जावा अंक की एक असीमित-लंबाई अनुक्रम, जिनमें से पहले एक जावा पत्र होना चाहिए है।
[...]
एक "जावा अक्षर" एक ऐसा चरित्र है जिसके लिए विधि Character.isJavaIdentifierStart (int) सत्य लौटाता है।
ए "जावा अक्षर-या-अंक" एक वर्ण है जिसके लिए विधि Character.isJavaIdentifierPart (int) सत्य लौटाता है।

public static void main(String[] args) { 
    String s = "123 sdkjh s;sdlkjh d"; 
    StringBuilder sb = new StringBuilder(); 
    if(!Character.isJavaIdentifierStart(s.charAt(0))) { 
     sb.append("_"); 
    } 
    for (char c : s.toCharArray()) { 
     if(!Character.isJavaIdentifierPart(c)) { 
      sb.append("_"); 
     } else { 
      sb.append(c); 
     } 
    } 

    System.out.println(sb); 
} 
+0

सहायता चाहिए , धन्यवाद @assylias –

+0

इसके बजाय '' _ '' जोड़ सकता है (स्ट्रिंग के बजाय char '_ "')। – NateS

3

आप वैध जावा पहचान में बदल यादृच्छिक तार परिवर्तित करना चाहते हैं।

पहचानकर्ता: the Java Language Specification, §3.8 के अनुसार, एक पहचानकर्ता की परिभाषा इस प्रकार है
IdentifierChars नहीं बल्कि एक कीवर्ड या BooleanLiteral या NullLiteral

IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter:
किसी भी यूनिकोड वर्ण एक जावा पत्र

JavaLetterOrDigit है कि:
किसी भी यूनिकोड वर्ण है कि एक जावा पत्र या अंकों है

ए आपको करना होगा, फिर, अपने इनपुट के माध्यम से कदम उठाएं और किसी भी अमान्य चरित्र को वैध के साथ प्रतिस्थापित करें (उदा। अंडरस्कोर) या इसे पूरी तरह से हटा दें। जावा Character कक्षा में विधियों को भी प्रदान करता है जो आपको बताता है कि कोई दिया गया वर्ण जावालेटर या जावालेटरऑरडिजिट: isJavaIdentifierStart() और isJavaIdentifierPart है। (यह अमान्य वर्णों को बाहर करने की कोशिश करने से कहीं अधिक आसान है क्योंकि वैध वर्णों का सेट छोटा है और अमान्य वर्णों का सेट बहुत बड़ा है।)

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

1

आप को:

  1. _
  2. के साथ बदलें \\s+\\W+
  3. की सभी घटनाओं निकालें _ उपसर्ग के रूप में, अगर ^\d मिलान (या यहां तक ​​कि नहीं करता है, तो)

तो

"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "") 
+0

यह काफी प्रतिबंधित है: कई मान्य वर्ण आपके बिंदु 2 के साथ बाहर किए जाएंगे। – assylias

+0

@assylias = निश्चित रूप से मेरा उत्तर केवल एक बुनियादी विचार है, जिसे बढ़ाया जा सकता है ... –

+0

assylias, ध्यान दें कि जावा का \ W' यूनिकोड होना चाहिए - और इस तरह एक गैर पहचानकर्ता चरित्र की परिभाषा काफी अच्छी तरह फिट बैठता है। – Joey

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