正则表达式删除两个字符串之间的子字符串

时间:2018-02-14 21:16:57

标签: java regex

周围有类似的例子,但我无法找到我的解决方案

目标:删除/ *和* /之间的所有(包括)数据。我使用下面的代码

String str="this /* asdasda */ is test";
str = str.replaceAll("/\\*.*?\\*/","") ;
System.out.println(str);

输出:

this  is test

当这些是嵌套的

时出现问题
String str="this /* asdas/* extra comments */da */ is test";
str = str.replaceAll("/\\*.*?\\*/","") ;
System.out.println(str);

输出

this da */ is test

我无法解决嵌套部分。我需要它来丢弃/ *和* /

之间的任何东西

例如

"this /* asdas/* extra commen/*   asdas  */  ts */da */ is test /* asdas */ asdasd ";

应该转换为

this  is test  asdasd 

2 个答案:

答案 0 :(得分:2)

replaceAll中的正则表达式更改为/\\*.*\\*/

跑步:

String str="this /* asdas/* extra comments */da */ is test";
str = str.replaceAll("/\\*.*\\*/","") ;
System.out.println(str);

输出:

this  is test

跑步:

String str="hello /*/* asdas/* eer/* hemmllo*/ */da */ */world";
str = str.replaceAll("/\\*.*\\*/","") ;
System.out.println(str);

输出:

hello world

编辑:

假设你使用简单的单词,试试这个:

replaceAll("(/\\*( *(\\w) *)*)|(( *(\\w) *)*\\*/)","").replaceAll("\\*/|/\\*","");

测试1:

String str="/* huhu /* jij */ /* */ here /* asfas /* kjk */ kh*/ here to";
str = str.replaceAll("(/\\*( *(\\w) *)*)|(( *(\\w) *)*\\*/)","").replaceAll("\\*/|/\\*","");
System.out.println(str);

输出:

   here  here to

测试2:

String str1="this /* asdas/* extra commen/*   asdas  */  ts */da */ is test /* asdas */ asdasd ";
str1 = str1.replaceAll("(/\\*( *(\\w) *)*)|(( *(\\w) *)*\\*/)","").replaceAll("\\*/|/\\*","") ;
System.out.println(str1);

输出:

this  is test  asdasd 

测试3:

String str2="this /* /* i */ is /**/ */ test";
str2 = str2.replaceAll("(/\\*( *(\\w) *)*)|(( *(\\w) *)*\\*/)","").replaceAll("\\*/|/\\*","") ;
System.out.println(str2);

输出:

this   is   test

答案 1 :(得分:1)

Java不支持递归匹配,因此您无法一次完成任务。对于支持递归正则表达式匹配的语言,您可以尝试类似:

<script src="https://unpkg.com/vue"></script> <div id="app"> <p>{{ message }}</p> <input type="date" :value="myDate && myDate.toISOString().split('T')[0]" @input="myDate = $event.target.valueAsDate"> <p> <code> myDate: {{ myDate }}</code> </p> <button @click="setMyDateToToday">Set date one to today</button> <button @click="addADayToMyDate">Add a day to my date</button> </div>

要在Java中模拟递归匹配,您可以在实际正则表达式之外添加逻辑(执行多次传递)。

取出<t t-if="a in b"> <!-- do something --> </t> (\/\*(?>[^\/\*\*\/]+|(?1))*\*\/)部分,您有

|(?1)

如果你使用这样的模式匹配器:

or

最后一遍将为您提供您正在寻找的字符串

请参阅https://regex101.com/在线试用正则表达式,我发现它很有帮助。