2012-05-05 13 views
5

मैं कर्सर के साथ चयनित निम्न पाठ की तरह पाठ है कहते हैं:एकल पंक्ति विराम निकालें, रखना "खाली" लाइनों

This is a test. This is a test 

This is a test. This is a test 

अन्य में:

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

मैं इसे में बदलना चाहते हैं शब्दों, मैं अकेले खाली लाइनों को छोड़कर, रिक्त स्थान से सिंगल लाइन ब्रेक को प्रतिस्थापित करना चाहता हूं।

मैंने सोचा था कि निम्नलिखित की तरह कुछ काम करेगा:

RemoveSingleLineBreaks() 
{ 
    ClipSaved := ClipboardAll 
    Clipboard = 
    send ^c 
    Clipboard := RegExReplace(Clipboard, "([^(\R)])(\R)([^(\R)])", "$1$3")  
    send ^v 
    Clipboard := ClipSaved 
    ClipSaved = 
} 

लेकिन ऐसा नहीं है। अगर मैं ऊपर पाठ करने के लिए इसे लागू है, यह पैदावार:

This is a test. This is a test. 
This is a test. This is a test. 

जो भी "खाली लाइन" बीच में से हटा दिया। यह वह नहीं है जिसकी मुझे चाहत है।

स्पष्ट करने के लिए: एक खाली पंक्ति मैं "सफेद" वर्ण (उदा टैब या सफेद रिक्त स्थान)

किसी भी विचारों के साथ किसी भी लाइन मतलब तक कि यह कैसे करना है?

उत्तर

1
Clipboard := RegExReplace(Clipboard, "(\S+)\R", "$1 ") 
+0

जब मैं इस चलाने के लिए, स्क्रिप्ट पाठ को हटा देता है (अर्थात 'Clipboard' कोई रिक्त स्ट्रिंग असाइन किया गया है) –

+0

हाँ ... समाधान incorect है, यह ध्यान न दें। यह एक मेल नहीं खाता था, लेकिन वह नहीं था। समस्या यह थी कि लाइन के अंत से पहले खाली रिक्त स्थान हो सकते हैं। मुझे परेशानी हो रही है और इसे regex के साथ ही कार्यान्वित कर रहा है :) – mihai

1

मेरा मानना ​​है कि यह काम करेगा:

text= 
(
This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 
) 
MsgBox % RegExReplace(text,"\S\K\v(?=\S)",A_Space) 
4
RegExReplace(Clipboard, "([^\r\n])\R([^\r\n])", "$1$2") 

यह एकल लाइन हटेगा टूट जाता है नई लाइन टोकन संभालने में शामिल है या तो एक CR या अंत में एक LF (जैसे CR, LF, CR+LF, LF+CR)। यह सफेद जगह को खाली के रूप में नहीं मानता है।

\ एक चरित्र वर्ग के भीतर आर केवल अक्षर है "आर" [source]

समाधान CR और LF उपयोग करने के लिए है:

आपका मुख्य समस्या \R का उपयोग किया गया सीधे चरित्र।


स्पष्ट करने के लिए: एक खाली पंक्ति मैं "सफेद" अक्षर के साथ किसी भी लाइन मतलब द्वारा (जैसे टैब या सफेद रिक्त स्थान)

RegExReplace(Clipboard, "(\S.*?)\R(.*?\S)", "$1$2") 

यह ऊपर एक के रूप में एक ही है, लेकिन सफेद के रूप में सफेद जगह की गणना करता है। यह काम करता है क्योंकि . डिफ़ॉल्ट रूप से लाइन ब्रेक से मेल नहीं खाता है, क्योंकि यह लाइन ब्रेक को बिना किसी लालची (*?) को छोड़कर सभी गैर-व्हाइटस्पेस चरित्र तक लाइन ब्रेक को छोड़कर सभी अक्षरों को स्वीकार करता है।


मैं रिक्तियों द्वारा एकल पंक्ति विराम को बदलने के लिए खाली लाइनों अकेले छोड़ने के लिए चाहते हैं।

आप रिक्त स्थान के साथ लाइन ब्रेक बदलना चाहते हैं, तो यह अधिक उपयुक्त है:

RegExReplace(Clipboard, "(\S.*?)\R(.*?\S)", "$1 $2") 

यह एकल लाइन एक स्थान के साथ टूट जाता है की जगह लेगा।


और तुम lookbehinds और lookaheads उपयोग करना चाहता था, तो:


पट्टी एकल पंक्ति विराम:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", "") 


एक लाइन की जगह रिक्त स्थान के साथ टूट जाता है:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", " ") 

के लिए कुछ कारण, \S डब्ल्यू प्रतीत नहीं होता है lookkhinds और lookaheads में ओर्क। कम से कम, मेरे परीक्षण के साथ नहीं।

1
#SingleInstance force 

#v:: 
    Send ^c 
    ClipWait 
    ClipSaved = %clipboard% 

    Loop 
    { 
     StringReplace, ClipSaved, ClipSaved, `r`n`r`n, `r`n, UseErrorLevel 
     if ErrorLevel = 0 ; No more replacements needed. 
      break 
    } 
    Clipboard := ClipSaved 
    return 
संबंधित मुद्दे