2009-09-04 25 views
14

मेरे पास कुछ जटिल नियमित अभिव्यक्तियां हैं जिन्हें मुझे पठनीयता और रखरखाव के लिए टिप्पणी करने की आवश्यकता है। जावा स्पेक बदले में है और मैं इस काम को प्राप्त करने में काफी समय से संघर्ष कर रहा हूं। मैं अंत में मेरी बग पकड़ लिया और एक जवाब के रूप में यह पोस्ट करेंगे, लेकिन मैं बनाए रखने regexesजावा नियमित अभिव्यक्तियों में टिप्पणियां सहित

एक उदाहरण मैं एक साधारण नाम पार्सर में उप-घटक (पैटर्न के) टिप्पणी करना चाहते हैं के रूप में किसी भी अन्य सलाह के लिए आभारी होगी:

String testTarget = "Waldorf T. Flywheel"; 
    String patternS = "([A-Za-z]+)\\s+([A-Z]\\.)?\\s+([A-Za-z]+)"; 
    Pattern pattern = Pattern.compile(patternS, Pattern.COMMENTS); 
    Assert.assertTrue(pattern.matcher(testTarget).matches()); 

संपादित करें: मैं (? X) प्रारूप के उदाहरणों के लिए भी आभारी रहूंगा।

संपादित करें: @ geowa4 में एक अच्छा सुझाव है जो एम्बेडेड टिप्पणियों से बचाता है। सिन्स जावा और अन्य ने एम्बेडेड टिप्पणियों के लिए प्रदान किया है, वे मामले क्या हैं जहां वे उपयोगी हैं? (मुझे लगता है कि मेरे पास एक मामला है लेकिन मुझे दूसरों को देखने में दिलचस्पी होगी)।

संपादित करें: नीचे @mikej regex वैकल्पिक प्रारंभिक अच्छी तरह से समर्थन नहीं करता है और हो सकता है बताया गया है के रूप में बेहतर:

 String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)"; 

लेकिन यह है कि प्रारंभिक

उत्तर

21

regexp पठनीयता में सुधार लाने पर कुछ अधिक विचारों के लिए ComposedRegex पर Martin Fowler द्वारा पोस्ट देखें। संक्षेप में, वह छोटे भागों में एक जटिल regexp तोड़ने की वकालत करता है जिसे सार्थक चर नाम दिया जा सकता है। जैसे

String mandatoryName = "([A-Za-z]+)"; 
String mandatoryWhiteSpace = "\\s+"; 
String optionalInitial = "([A-Z]\\.)?"; 
String pattern = mandatoryName + mandatoryWhiteSpace + optionalInitial + 
    mandatoryWhiteSpace + mandatoryName; 
+0

धन्यवाद - यह एक उपयोगी दृष्टिकोण है। यह regexes उत्पन्न करने के लिए डोमेन विशिष्ट भाषाओं का उपयोग करने के एक और विचार की ओर इशारा करता है (http://flimflan.com/blog/ReadableRegularExpressions.aspx)। (यह वास्तव में मैं अपने आवेदन में करता हूं जिसमें वैज्ञानिक डेटा के लिए compsed regexes के जटिल संयोजन हैं लेकिन यह इस प्रश्न के दायरे से बाहर है)। –

+1

यह एक बहुत साफ और साफ समाधान है। यद्यपि वैकल्पिक WhiteSpace शायद अनिवार्य होना चाहिए WiteSpace? :) – crunchdog

+0

धन्यवाद crunchdog। मुझे लगता है कि मुझे क्या पकड़ा गया है वास्तव में ओपी में पैटर्न में एक सीमा है कि अगर हमारे पास फ्रेड ब्लॉग्स जैसे मध्य प्रारंभिक नाम के बिना कोई नाम है तो हमें दो नामों के मिलान के लिए पहले नाम और उपनाम के बीच 2 रिक्त स्थान की आवश्यकता है \ पैटर्न में \ s +। मैं इसे संबोधित करने की कोशिश कर रहा था लेकिन अभी के लिए मैंने ओपी में एक के बराबर पैटर्न बनाने के लिए जवाब संपादित किया है। – mikej

11

में अंतरिक्ष निकालने हो जाएंगे मैंने पाया काम के बाद:

 String pattern2S = 
      "([A-Za-z]+)  # mandatory firstName\n" + 
      "\\s+    # mandatory whitespace\n " + 
      "([A-Z]\\.)?  # optional initial\n" + 
      "\\s+    # whitespace\n " + 
      "([A-Za-z]+)  # mandatory lastName\n"; 

मुख्य बात newline चरित्र \ स्ट्रिंग में स्पष्ट रूप से n शामिल करने के लिए था

15

आप क्यों नहीं बस ऐसा नहीं करते हैं:

String pattern2S = 
    "([A-Za-z]+)" + // mandatory firstName 
    "\\s+" +  // mandatory whitespace 
    ...; 

CONTINUATION:

आप पैटर्न के साथ टिप्पणियां रखना चाहते हैं और आप में से एक गुण फ़ाइल यह पढ़ने की जरूरत है, इस का उपयोग करें:

pattern=\ 
#comment1\\n\ 
(A-z)\ 
#comment2\\n\ 
(0-9) 
+0

अच्छा सुझाव। यह कई साधारण मामलों में काम करेगा लेकिन मैं नियमित अभिव्यक्तियों को उस कोड से स्वतंत्र होना चाहता हूं जिसमें उनका उपयोग किया जाता है (उदा। बाहरी डेटा फ़ाइलों में)। इनलाइन टिप्पणियां अभी भी दिखाई देगी। –

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