2012-07-25 14 views
15

से प्राप्त नई लाइन से मेल नहीं खाती है, Formatter ऑब्जेक्ट या String.format() में %n का उपयोग करके नई लाइन प्राप्त होने पर मैं न्यूलाइन युक्त स्ट्रिंग से मेल नहीं खा सकता हूं। कृपया निम्नलिखित कार्यक्रम पर एक नजर है:नियमित अभिव्यक्ति फॉर्मेटर ऑब्जेक्ट

public class RegExTest { 

    public static void main(String[] args) { 
    String input1 = String.format("Hallo\nnext line"); 
    String input2 = String.format("Hallo%nnext line"); 
    String pattern = ".*[\n\r].*"; 
    System.out.println(input1+": "+input1.matches(pattern)); 
    System.out.println(input2+": "+input2.matches(pattern)); 
    } 

} 

और इसके उत्पादन:

Hallo 
next line: true 
Hallo 
next line: false 

क्या यहाँ चल रहा है? दूसरा स्ट्रिंग मैच क्यों नहीं है?

जावा संस्करण 1.6.0_21 है।

उत्तर

43

आप . न्यूलाइन से मेल खाने के लिए Pattern.DOTALL ध्वज सेट कर सकते हैं, डिफ़ॉल्ट रूप से यह नहीं है। यह (?s) नोटेशन के साथ किया जाता है। ,

String pattern = "(?s).*[\n\r].*"; 
+0

फिर क्यों करता है पहले एक मैच (मैं खिड़कियों पर हूँ) ? – Axel

+1

इसके अलावा, आप '[\ r \ n]' भाग को \ \ r \ \ \ 'दोनों \ n' और '\ r \ n' से मिलान करने में सक्षम होने के लिए स्विच कर सकते हैं। – Keppil

+2

बस पता चला। विंडोज़ पर, लाइनएंड '\ r \ n' है। 'इनपुट 1' में '\ n' को लाइन अंत नहीं माना जाता है और इसलिए रेगेक्स मिलान होता है। – Axel

9

Windows पर जावा में, \n वामो है, \r सीआर और %n CRLF है: तो, यह regex आप क्या चाहते हैं नहीं करता है। आपका पैटर्न बाद वाले से मेल नहीं खाता है।

जावा 8 के रूप में, अब आप किसी भी अंत-रेखा अनुक्रम से मेल खाने के लिए नियमित अभिव्यक्तियों में \R का उपयोग कर सकते हैं।

LINEBREAK मिलान बराबर करने के लिए

\R किसी भी यूनिकोड LINEBREAK अनुक्रम, है \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

उदाहरण:

String pattern = ".*\\R.*"; 
String.format("Hallo\nnext line").matches(pattern); // true 
String.format("Hallo%nnext line").matches(pattern); // true 
String.format("Hallo same line").matches(pattern); // false 
+0

हां, "। * \ R? \ N। *" काम करता है, लेकिन यदि कई लाइन ब्रेक नहीं हैं। अब मैं "(? एस) का उपयोग कर रहा हूं। * [\ N \ r]। *"। – Axel

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