2011-12-19 8 views
6

मुझे निम्न अभिव्यक्ति मिल गई है जो इस तरह दिख सकता है (वर्ग [XXX] की मात्रा unknow है)कई एसकर्ट (कुछ पाठ अंदर] "में कई वर्ग (कुछ पाठ अंदर) में कैसे बदलना है, मेरा मतलब है [] में()

Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D] 

और मैं Sqrt(XXX) में सभी Sqrt[XXX] चालू करना चाहते हैं, मैं इतना ऊपर के उदाहरण

तरह दिखेगा () कोष्ठक

में Sqrt की [] कोष्ठक बदलना चाहते हैं Sqrt(A+B) + Sqrt(Min[A,B]) * Min[Sqrt(C),D]

मैं "चोट" करने के लिए अभिव्यक्ति (Min के बगल में लोगों की तरह) में अन्य [] कोष्ठक नहीं करना चाहती

मैं कैसे regex के साथ ऐसा कर सकते हैं?

+4

आप रेगुलर एक्सप्रेशन के साथ यह नहीं कर सकते, देख स्वीकार किए जाते हैं जवाब यहाँ http://stackoverflow.com/questions/5475804/regular-expression-for-math-operations-with-parentheses –

+0

@MK मैं के साथ डर बैकट्रैकिंग वह आम तौर पर कर सकता था (समझदार आरईएस और गड़बड़ी के बीच का अंतर अब हम पर्ल के लिए धन्यवाद ~)। लेकिन मैं मानता हूं कि यह जाने का रास्ता नहीं है। – Voo

+0

@Voo मुझे यकीन है कि आप बैकट्रैकिंग के साथ भी नहीं कर सकते हैं। –

उत्तर

3

आप स्ट्रिंग में वर्णों पर पुनरावृत्ति का उपयोग करके ऐसा कर सकते हैं। सबसे पहले Sqrt[ की अनुक्रमणिका के लिए देखो और फिर मिलान समापन ब्रैकेट की तलाश करें।

final String s = "Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D]"; 
final char[] charArray = s.toCharArray(); 

int index = s.indexOf("Sqrt["); 
while (index != -1) { 
    final int open = index + 4; 
    charArray[open] = '('; 

    // look for closing bracket 
    int close; 
    int matching = 0; 
    for (close = open + 1; close < charArray.length; close++) { 
     char c = charArray[close]; 
     if (c == ']') { 
      if (matching == 0) { 
       break; 
      } 
      matching--; 
     } else if (c == '[') { 
      matching++; 
     } 
    } 
    charArray[close] = ')'; 
    index = s.indexOf("Sqrt[", index + 1); 
} 
System.out.println(new String(charArray)); 

मैं इसे ठीक से परीक्षण नहीं किया, इसलिए कृपया:

यहां कुछ नमूना कोड है।

+0

(+1) मैंने कोड का परीक्षण करने का प्रयास नहीं किया है, लेकिन मुझे लगता है कि इस प्रकार का दृष्टिकोण नियमित अभिव्यक्ति का उपयोग करने से समस्या के लिए अधिक अनुकूल है। – NPE

+0

हाँ जो काम करना चाहिए, हालांकि किसी को वास्तव में 'वर्ग [ए + एसकर्ट [ए]]' के साथ एक टेस्टकेस जोड़ना चाहिए। लेकिन यह बिना किसी समस्या के काम करना चाहिए। – Voo

+0

यह एसकर्ट [ए + एसकर्ट [ए]] पर काम करता है, :) – Daniel

1

स्रोत स्ट्रिंग के दिए गए प्रारूप का उपयोग करके, आप इसे 3 नियमित अभिव्यक्तियों के साथ कर सकते हैं। यहां की चाल Min फ़ंक्शन से संबंधित स्क्वायर ब्रैकेट को "नाम बदलें" और बाद में उन्हें पुनर्स्थापित करना है। आप कुछ ऐसा करेंगे:

s/Min\[([^[]+)\]/Min\{$1\}/g; 
s/Qsrt\[([^[]+)\]/Sqrt\($1\)/g; 
s/Min\{([^{]+)\}/Min\[$1\]}/g; 

सामान्य मामले के लिए एक पार्सर जाने का रास्ता होगा। इस तरह के विशेष मामलों के लिए एक चाल का उपयोग कर काम कर सकते हैं :-)।

+0

जावा में इस नियमित "नामकरण" को दिखाने का कोई मौका? बस एक स्निपेट ... – Daniel

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