2015-12-04 262 views
1

在Java中从字符串中删除的文字我想通过正则表达式来删除以下字符串一些文字:通过正则表达式

someText 

begin 
    .someMethod() 
    .doSomething(TOKEN_123) 
    .someMethod() 
end 

begin 
    .someMethod() 
    .doSomething(TOKEN_456) 
    .someMethod() 
end 

begin 
    .someMethod() 
    .doSomething(TOKEN_789) 
    .someMethod() 
end 

more Text 

我想删除第二个开始/结束块,包括字符串TOKEN_456。

目前我正则表达式如下所示

begin.*TOKEN_456(.*?)end 

但是这一次移除第一和第二块。

任何人都可以帮忙吗?

格尔茨

+0

我想你有单线标志。为什么不用多个换行符分割并删除结果数组的元素,然后加入剩下的元素?顺便说一句,你正在寻找'begin(?:(?!begin)。* TOKEN_456(。*?)end'。 –

+0

@tripleee:当然不是这个。 –

+0

正如我所提到的,这个复制绝对是不正确的,它不是用否定的字符类或懒点匹配来解决的,从而减轻了近距离投票。 –

回答

2

您可以使用

str = str.replaceFirst("(?s)begin(?:(?!begin).)*TOKEN_456.*?end\\s*", "")); 

IDEONE demoregex demo

正则表达式匹配:

  • (?s) - 一个单线修改
  • begin - 那些没有启动任何文本相匹配的回火贪婪的象征 - 领先的边界,字符序列begin
  • (?:(?!begin).)*匹配单词begin
  • TOKEN_456 - 与文字字符序列匹配
  • .*?end - 任何数量的字符尽可能少,最多可达end
  • \\s* - 0或更多空格(用于修剪目的)。
+0

工作就像一个魅力:) thx –

+0

如果你添加更多的“锚定”的细节,如字边界,*行开始*锚*,新行:['“(?sm)^开始\\ B你可以提高正则表达式的性能(:(\\ \\ bbegin b)?!)* TOKEN_456 \ NEND(*?)(?:$ | \ n)的“'](https://regex101.com/r/vN5vT7/2) 。 –

+0

刚刚注意到'(。*?)'上的捕获组 - 如果您对捕获的文本不感兴趣,我想你可以删除括号。 –