簡體   English   中英

正則表達式:刪除方括號的內容

[英]Regex: delete contents of square brackets

是否有正則表達式可用於搜索/替換以刪除方括號(和括號)中發生的所有內容?

我試過\\[.*\\]會扼殺額外的東西(例如"[chomps] extra [stuff]"

另外,當存在嵌套括號時,與延遲匹配\\[.*?\\]相同的東西不起作用(例如"stops [chomping [too] early]!"

嘗試這樣的事情:

$text = "stop [chomping [too] early] here!";
$text =~ s/\[([^\[\]]|(?0))*]//g;
print($text);

將打印:

stop  here!

一個簡短的解釋:

\[            # match '['
(             # start group 1
  [^\[\]]     #   match any char except '[' and ']'
  |           #   OR
  (?0)        #   recursively match group 0 (the entire pattern!)
)*            # end group 1 and repeat it zero or more times
]             # match ']'

上面的正則表達式將替換為空字符串。

您可以在線測試: http//ideone.com/tps8t

編輯

正如@ridgerunner所提到的,你可以通過使*和字符類[^\\[\\]]匹配一次或多次使其占有 ,甚至通過從第1 創建非捕獲組來更有效地使正則表達式:

\[(?:[^\[\]]++|(?0))*+]

但是,當使用大字符串時,速度的真正提高可能是顯而易見的(當然,你可以測試它!)。

對於正則表達式,這在技術上是不可能的,因為您匹配的語言不符合“常規”的定義。 有一些擴展的正則表達式實現,無論如何都可以使用遞歸表達式,其中包括:

格里塔:

http://easyethical.org/opensource/spider/regexp%20c++/greta2.htm#_Toc39890907

PCRE

http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions

請參閱“遞歸模式”,其中有一個括號示例。

PCRE遞歸括號匹配將如下所示:

\[(?R)*\]

編輯:

既然您已經添加了Perl,那么這里是一個明確描述如何在Perl中匹配平衡運算符對的頁面:

http://perldoc.perl.org/perlfaq6.html#Can-I-use-Perl-regular-expressions-to-match-balanced-text%3f

就像是:

$string =~ m/(\[(?:[^\[\]]++|(?1))*\])/xg;

由於您使用的是Perl,因此可以使用CPAN中的模塊,而不必編寫自己的正則表達式。 查看Text::Balanced模塊,該模塊允許您從平衡分隔符中提取文本。 使用此模塊意味着如果您的分隔符突然變為{} ,則無需弄清楚如何修改多毛的正則表達式,您只需在一個函數調用中更改delimiter參數。

如果您只關心刪除內容而不是捕獲它們以便在其他地方使用,則可以使用從嵌套組內部重復刪除到外部。

my $string = "stops [chomping [too] early]!";
# remove any [...] sequence that doesn't contain a [...] inside it
# and keep doing it until there are no [...] sequences to remove
1 while $string =~ s/\[[^\[\]]*\]//g; 
print $string;

條件為真時, 1 while基本上什么都不做。 如果s///匹配並刪除括號內的部分,則重復循環並再次運行s///

即使您在Bart Kiers的答案中使用舊版本的Perl或其他不支持(?0)遞歸擴展模式的語言,這也會有效。

你想只刪除不是[] s本身的[]之間的東西。 IE:

\[[^\]]*\]

這是一個相當毛茸茸的[] s ;-)

但它不會處理多個嵌套的[]。 IE,匹配[foo [bar] baz]將無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM