2008-09-15 12 views
5

के बाद मिलान करने के लिए मिलान करने के लिए मैं एक मल्टीलाइन रेगेक्स की तलाश में हूं जो रिक्त रेखा के बाद घटनाओं से मेल खाएगा। उदाहरण के लिए, नीचे एक नमूना ईमेल दिया गया है, मैं "से: एलेक्स" से मेल खाना चाहता हूं। ^From:\s*(.*)$ किसी भी लाइन से मेल खाने के लिए काम करता है, लेकिन मैं इसे शरीर में लाइनों तक सीमित करना चाहता हूं (पहली खाली रेखा के बाद कुछ भी)।मल्टीलाइन सी # रेगेक्स एक रिक्त रेखा

 
Received: from a server 
Date: today 
To: Ted 
From: James 
Subject: [fwd: hi] 

fyi 

----- Forwarded Message ----- 
To: James 
From: Alex 
Subject: hi 

Party! 

उत्तर

2

मुझे सी # नियमित अभिव्यक्तियों के सिंटैक्स के बारे में निश्चित नहीं है, लेकिन आपको स्ट्रिंग की शुरुआत में लंगर (^ जैसी रेखा की शुरुआत नहीं) के लिए एक रास्ता होना चाहिए। कि काम करता है

\A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$ 

आप पर बहु ​​मिलान विकल्प बारी सुनिश्चित करें, हालांकि, बनाने के लिए: मैं अपने उदाहरण में है कि "\ ए 'फोन करता हूँ"। " मैच \ n

+0

धन्यवाद। मुझे सिंगललाइन मोड को चालू करने के लिए भी आवश्यक था, और इसका उपयोग करें। *? के बजाय ।*। – user10392

0

ऐसी नौकरियों के लिए जटिल नियमित अभिव्यक्ति लिखना एक बुरा विचार आईएमओ है। कई सरल प्रश्नों को गठबंधन करना बेहतर है। उदाहरण के लिए, शरीर की शुरुआत को खोजने के लिए पहली बार "\ r \ n \ r \ n" की खोज करें, फिर शरीर पर सरल रेगेक्स चलाएं।

0

यह एक पीछे-पीछे दावा का उपयोग कर रहा है। समूह 1 आपको "से" लाइन देगा, और समूह 2 आपको वास्तविक मान ("एलेक्स", आपके उदाहरण में) देगा।

(?<=\n\n).*(From:\s*(.*?))$ 
0
\s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+? 

\s{2,} मैचों कम से कम दो खाली स्थान के वर्ण, से अपना पहला अर्थ: जेम्स मारा नहीं होंगे। तो यह सिर्फ "से:" की तलाश करने की बात है और वहां से कैप्चरिंग शुरू करें।

RegexOptions.SingleLine और RegexOptions.ExplicitCapture के साथ इसका उपयोग करें, इसका मतलब है कि बाहरी समूह नहीं मारा जाएगा।

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