2012-05-05 41 views
5

Nói rằng tôi có văn bản như văn bản sau đây được lựa chọn với con trỏ:Di ngắt dòng duy nhất, giữ cho dòng "trống rỗng"

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

Tôi muốn biến nó thành:

This is a test. This is a test 

This is a test. This is a test 

Trong khác các từ, tôi muốn thay thế các ngắt dòng đơn bằng dấu cách, để lại các dòng trống một mình.

Tôi nghĩ một cái gì đó như sau sẽ làm việc:

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

Nhưng nó không. Nếu tôi áp dụng nó cho văn bản ở trên, nó mang lại:

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

cũng loại bỏ "dòng trống" ở giữa. Đây không phải là điều tôi muốn.

Để làm rõ: Bằng một dòng trống Ý tôi là bất kỳ phù hợp với nhân vật "trắng" (ví dụ phím space hoặc tab trắng)

Bất kỳ suy nghĩ làm thế nào để làm điều này?

Trả lời

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

Khi tôi chạy điều này, tập lệnh xóa văn bản (tức là 'Clipboard' được gán một chuỗi trống) –

+0

vâng ... giải pháp được kết hợp, bỏ qua nó. Nó có một dấu ngoặc đơn không khớp, nhưng đó không phải là nó. Vấn đề là bạn có thể có không gian trống trước khi kết thúc dòng. Tôi đang gặp rắc rối cũng như thực hiện điều này chỉ với regex :) – mihai

1

Tôi tin rằng điều này sẽ làm việc:

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") 

này sẽ tước dòng duy nhất phá vỡ giả sử dòng thẻ mới chứa hoặc là một CR hoặc một LF ở cuối (ví dụ CR, LF, CR+LF, LF+CR). Nó không tính khoảng trống khi trống.

vấn đề chính của bạn là sử dụng các \R:

\ R bên trong một lớp nhân vật chỉ là chữ "R" [source]

Các giải pháp là sử dụng CRLF ký tự trực tiếp.


Để làm rõ: Bằng một dòng trống Ý tôi là bất kỳ phù hợp với nhân vật "trắng" (ví dụ như tab hoặc không gian trắng)

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

Đây là giống như một ở trên, nhưng đếm khoảng trống là trống. Nó hoạt động bởi vì nó chấp nhận tất cả các ký tự ngoại trừ ngắt dòng không tham lam (*?) tối đa ký tự không khoảng trắng đầu tiên ở phía sau và trước dấu ngắt dòng vì mặc định . không khớp với ngắt dòng.


Tôi muốn thay thế ngắt dòng duy nhất bằng cách không gian, để lại dòng trống một mình.

Nếu bạn muốn thay thế các ngắt dòng với không gian, đây là thích hợp hơn:

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

này sẽ thay thế dòng duy nhất phá vỡ với một không gian.


Và nếu bạn muốn sử dụng lookbehinds và lookaheads:


Strip đơn ngắt dòng:

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


Thay thế dòng duy nhất phá vỡ với không gian:

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

Đối một số lý do, \S dường như không ork trong lookbehinds và lookaheads. Ít nhất, không phải với thử nghiệm của tôi.

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