正则表达式打破匹配标准之间的所有字符

时间:2016-02-18 08:24:37

标签: regex

需要帮助构建正则表达式,以便在匹配条件之间单独获取所有字符。

e.g。
说明是

  

1STARTDESCdescENDDESC2STARTDESCdescENDDESC3STARTDESCdescENDDESC4STARTDESCdescENDDESC5STARTDESCdescENDDESC6STARTDESCdescENDDESC7STARTDESCvalveENDDESC8STARTDESCvalveENDDESC9STARTDESCvalveENDDESC10STARTDESCvalveENDDESC

和正则表达式是

((((\d+STARTDESC))((?!STARTDESC).)*(desc)((?!STARTDESC).)*((ENDDESC))))

如果我们将此正则表达式更改为

\dSTARTDESC

它将匹配所有desc描述。 需要正则表达式来匹配ENDDESCd,e,s,c之间的任何内容,并分别获取所有字符。 像这里我需要v,a,l,v,ebq

1 个答案:

答案 0 :(得分:0)

您可以使用基于使用\G运算符指定的自定义边界+使用调和贪婪令牌的正则表达式来确保我们仅匹配STARTDESCENDDESC之前的单个字符:

(\d+STARTDESC|(?!^)\G).(?=(?:(?!(?:START|END)DESC).)*ENDDESC)

请参阅regex demo。如果Pattern.DOTALL实际上可以包含换行符号,请使用desc

模式分解:

  • (\d+STARTDESC|(?!^)\G) - 匹配一个或多个数字(\d+),后跟STARTDESC或上次成功匹配后的位置((?!^)\G
  • . - 任何字符,但换行符(包含Pattern.DOTALL,任意字符),但仅限于后跟...
  • (?=(?:(?!(?:START|END)DESC).)*ENDDESC) - ENDDESC前面没有STARTDESCENDDESC

完整IDEONE code demo

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "1STARTDESCdescENDDESC2STARTDESCdescENDDESC3STARTDESCdescENDDESC4STARTDESCdescENDDESC5STARTDESCdescENDDESC6STARTDESCdescENDDESC7STARTDESCvalveENDDESC8STARTDESCvalveENDDESC9STARTDESCvalveENDDESC10STARTDESCvalveENDDESC"; 
        String pattern = "(\\d+STARTDESC|(?!^)\\G).(?=(?:(?!(?:START|END)DESC).)*ENDDESC)";
        String subst = "$1DUMMY";
        System.out.println(s.replaceAll(pattern, subst));
    }
}