2015-02-27 8 views
6

मैं जावा में str.replaceAll का उपयोग कर उद्धरण के बाहर तार को बदलने के लिए लेकिन अछूताकैसे उद्धरण

कोट के अंदर शब्द छोड़ने के लिए चाहते हैं, तो मैं पाई के साथ एप्पल की जगह के बाहर शब्दों को बदलने के:

इनपुट: एप्पल "एप्पल एप्पल एप्पल"
वांछित आउटपुट: पाई "एप्पल एप्पल एप्पल"

नोट कोट के अंदर शब्द अछूता थे

यह कैसे किया जाना चाहते हैं? सभी मदद की सराहना की!

+1

क्यों अपने उदाहरण में कोष्ठक कर रहे हैं? क्या उद्धरण के चारों ओर हमेशा माता-पिता होंगे? –

+0

नहीं, हमेशा उद्धरण –

+1

@ freakshow1217 के आसपास माता-पिता नहीं होंगे, इसलिए आप केवल शब्द की पहली घटना को बदलना चाहते हैं? –

उत्तर

5

Apple lookaheads का उपयोग कर यकीन है कि यह उद्धरण से घिरा हुआ नहीं है बनाने के लिए के लिए खोजें:।?

(?=(([^"]*"){2})*[^"]*$)Apple 

और द्वारा बदल देते हैं:

Pie 

RegEx Demo


अद्यतन:

टिप्पणियों के आधार पर नीचे आप का उपयोग कर सकते हैं:

कोड:

String str = "Apple \"Apple\""; 
String repl = str.replaceAll("(?=(([^\"]*\"){2})*[^\"]*$)Apple", "Pie"); 
//=> Pie "Apple" "Another Apple Apple Apple" Pie 
+1

पर आज़माएं, यह "क्रैबएपल" को "क्रैबपी" में बदलने का (संभावित रूप से वांछित) दुष्प्रभाव होगा, है ना? – childofsoong

+0

ठीक शब्द सीमाओं का उपयोग इससे बचने के लिए किया जा सकता है। – anubhava

+1

धन्यवाद! यह अच्छी तरह से काम करता है –

0

मैं इस मान रहा है कि आप क्या चाहते:

String str = "Apple \"Apple\""; 
String replace = str.replaceAll("(?<!\")Apple(?!\")", "Pie"); 

यहाँ काम कर रहे है: https://regex101.com/r/kP0oV1/2

+0

मैं इसका उपयोग कैसे करूं? –

+0

@ freakshow1217 ने जवाब संपादित किया, इसे –

0

यह अपने परीक्षण के लिए काम करता है:

package mavensandbox; 


import static junit.framework.TestCase.assertEquals; 

public class Test { 

    @org.junit.Test 
    public void testName() throws Exception { 
     String input = "Apple(\"Apple\")"; 
     String output = replaceThoseWithoutQuotes("Apple", "Pie", input); 
     assertEquals("Pie(\"Apple\")", output); 
    } 

    private String replaceThoseWithoutQuotes(String replace, String with, String input) { 
     return input.replaceAll("(?<!\")" + replace + "(?!\")", with); 
    } 
} 

मैं उपयोग कर रहा हूँ एक negative lookahead and a negative lookbehind क्या कहते हैं । यह मैचों में एक "सामने या इसके पीछे की जरूरत नहीं है कि पाता है आप के लिए है कि काम

0

इसके बाद सफेद स्थान के साथ शब्द मिलान की कोशिश करो।

/एप्पल \ s/

तो यह बाद में एक ही सफेद स्थान के साथ पाई के साथ बदलें।

0

यदि आप इतने इच्छुक हैं, तो आप अधिक जटिल समाधान की तलाश में हैं, तो इसे और अधिक जटिल रेगेक्स के बिना ऐसा करने का विकल्प भी है। आप " पर विभाजित कर सकते हैं और यहां तक ​​कि क्रमांकित अनुक्रमणिका को प्रतिस्थापित कर सकते हैं और फिर स्ट्रिंग को पुनर्निर्माण कर सकते हैं।

String input = "\"unique\" unique unique \"unique\" \"unique\" \"unique\" \"unique\" unique \"unique unique\" unique unique \""; 
    System.out.println(input); 
    String[] split = input.split("\""); 
    for (int i = 0; i < split.length; i = i + 2) { 
     split[i] = split[i].replaceAll("unique", "potato"); 
    } 
    String output = ""; 
    for (String s : split) { 
     output += s + "\""; 
    } 
    System.out.println(output); 

आउटपुट:

"unique" unique unique "unique" "unique" "unique" "unique" unique "unique unique" unique unique " 
"unique" potato potato "unique" "unique" "unique" "unique" potato "unique unique" potato potato "