2011-09-30 19 views
13

में जावा रेगेक्स अवैध एस्केप कैरेक्टर मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मेरी अभिव्यक्ति वर्ग में पारित अभिव्यक्ति में ऑपरेटर है या नहीं। क्रमशः जोड़ने, घटाएं, गुणा करें, विभाजित करें और एक्सपोनेंट के लिए +-*/^जावा रेगेक्स कैरेक्टर क्लास

इस कोड के साथ क्या गलत है?

private static boolean hasOperator(String expression) 
{ 
    return expression.matches("[\+-\*/\^]+"); 
} 

मैंने सोचा कि मैं था कि विशेष वर्ण सही तरीके से छोड़े लेकिन मैं त्रुटि मिलती रहती है: "अवैध एस्केप वर्ण" जब संकलित करने के लिए कोशिश कर रहा।

आपकी मदद के लिए धन्यवाद।

उत्तर

27

बच नहीं क्या बच गए करने के लिए नहीं की जरूरत है:

return expression.matches("[-+*/^]+"); 

ठीक काम करना चाहिए। अधिकांश रेगेक्स मेटाएक्टैक्टर्स (., (, ), +, *, आदि) चरित्र वर्ग में उपयोग किए जाने पर उनका विशेष अर्थ खो देते हैं। जिन पर आपको ध्यान देना होगा [, -, ^, और ]। और पिछले तीन के लिए, आप रणनीतिक उन में वर्ण वर्ग जगह है ताकि वे अपने विशेष अर्थ नहीं लेते हैं कर सकते हैं:

  • ^ सही प्रारंभ कोष्ठक के बाद छोड़कर कहीं भी रखा जा सकता है: [a^]
  • - रखा जा सकता है सही प्रारंभ कोष्ठक या सही बंद कोष्ठक से पहले के बाद: [-a] या [a-]
  • ] सही प्रारंभ कोष्ठक के बाद रखा जा सकता है: []a]

लेकिन भविष्य में संदर्भ के लिए, यदि आप एक regex स्ट्रिंग में एक भागने चरित्र के रूप में एक बैकस्लैश शामिल करने की जरूरत है, आप इसे दो बार से बचने के लिए, उदाहरण के लिए की आवश्यकता होगी:

"\\(.*?\\)" // match something inside parentheses 

तो एक शाब्दिक बैकस्लैश मिलान करने के लिए, आप ' घ जरूरत उनमें से चार:

"hello\\\\world" // this regex matches hello\world 

एक और ध्यान दें: String.matches() पैटर्न के खिलाफ पूरे स्ट्रिंग के मिलान, इसलिए जब तक आपके स्ट्रिंग बस ऑपरेटरों के एक समूह के होते हैं, आप की आवश्यकता होगी कोशिश करेंगेका उपयोग .matches(".*[-+*/^].*"); बजाय की तरह कुछ का उपयोग करें (या Matcher.find())

+0

हां, मैं जा रहा था पागल सोच रहा से बचने के लिए की जरूरत है * जब समस्या आदेश + था - * लेने रेंज "प्लस तारांकन के माध्यम से" मतलब करने के बजाय " प्लस या माइनस या तारांकन "। यह स्पष्ट करने के लिए धन्यवाद! – WebChemist

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