需要帮助构建正则表达式,以便在匹配条件之间单独获取所有字符。
e.g。
说明是
1STARTDESCdescENDDESC2STARTDESCdescENDDESC3STARTDESCdescENDDESC4STARTDESCdescENDDESC5STARTDESCdescENDDESC6STARTDESCdescENDDESC7STARTDESCvalveENDDESC8STARTDESCvalveENDDESC9STARTDESCvalveENDDESC10STARTDESCvalveENDDESC
和正则表达式是
((((\d+STARTDESC))((?!STARTDESC).)*(desc)((?!STARTDESC).)*((ENDDESC))))
如果我们将此正则表达式更改为
\dSTARTDESC
它将匹配所有desc描述。
需要正则表达式来匹配ENDDESC
和d,e,s,c
之间的任何内容,并分别获取所有字符。
像这里我需要v,a,l,v,e
和bq
。
答案 0 :(得分:0)
您可以使用基于使用\G
运算符指定的自定义边界+使用调和贪婪令牌的正则表达式来确保我们仅匹配STARTDESC
或ENDDESC
之前的单个字符:
(\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
前面没有STARTDESC
或ENDDESC
。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));
}
}