2016-08-01 35 views
-2

我尋求一個單一的UNIX /的Perl/PHP樣式的正則表達式做文本字符串列表如下:正則表達式來重命名/修改重複的行

  • 搜索開頭第一線'#'字符
  • 修改所有字符串的搜索字符串,但沒有開頭的'#',這樣行也會以'#'開頭。這些行可能有尾隨文本(但不一定)。

這必須在一條路徑上完成。

例如爲:

some line 
# some string 
some line 
some line 
some line 
some string some other string 
some line 
some line 
some string 
some line 
some line 
some line 
some string some trailing text 
some line 

Regex101

所以我所尋求的是將匹配線# some string,然後在與some string啓動其他線路的開頭添加#正則表達式。這將匹配和修改都是線,

  • some string some other string - ># some string some other string
  • some string - ># some string
  • some string some trailing text - ># some string some trailing text

我想到做這樣^(#?[^\r\n]+$)[\s\S]*(^\1[^\r\n]*$)+東西匹配所有這些事件,但我需要拆分這個來代替每個單獨的事件...

謝謝。

+1

什麼正則表達式你到目前爲止已經試過? – AbhiNickz

+0

'^(#?[^ \ r \ n] + $)([\ s \ S] *)(^ \ 1 [^ \ r \ n] * $)+' – hoonose

回答

1

試圖把它寫成單個正則表達式聽起來像是不可維護代碼的祕訣。我會這樣寫:

my $prefix; 
while (<>) { 
    # If we find a line that starts with #, then set $prefix 
    if (/^# (.*)/) { 
    $prefix = $1; 
    } 

    # If $prefix is defined and we find a line that starts with $prefix, 
    # then prepend '#' 
    if (defined $prefix and /^$prefix/) { 
    $_ = "$prefix $_"; 
    } 

    print; 
} 
+0

謝謝。但是,這不是爲了代碼,而是作爲文本編輯器宏的一個步驟,這就是爲什麼需要一次運行它。如果我可以使用一個循環,我會做到這一點。 – hoonose

+0

在提問時提及這樣的限制可能是個好主意。 –

+0

戴夫,真的,謝謝,但我是要求一個正則表達式而不是代碼。 – hoonose

0

可變的後面將是偉大的。
但大多數正則表達式引擎不支持。只有固定的背後。

但是,如果您可以反轉該字符串列表。
然後你可能仍然可以在反轉的文字上使用積極的向前看。更換後將文本反轉。

一個非常簡單的例子。

我們先從文字:

z 
# a 
a y 
a 
x 

現在我們扭轉文本:

x 
a 
y a 
a # 
z 

現在我們全部更換(全球性的,多行)
(\w+$)(?=[\s\S]+\1 ?#)
通過\0 #

而我們得到:

x 
a # 
y a # 
a # 
z 

現在反向結果:

z 
# a 
# a y 
# a 
x