求一个正则表达式 过滤所有不在

cs_dubin 2008-03-13 02:52:02
如题
例如
<html
<script
<!--不可以删除-->
/script>

<!--需要删除-->
<!--需要删除-->

<script
<!--不可以删除-->
/script>

<!--需要删除-->
<!--需要删除-->

/html>

用一个正则表达式应该怎么写才能用replace方法
<html
<script
<!--不可以删除-->
/script>


<script
<!--不可以删除-->
/script>


/html>
...全文
886 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin-yy 2008-09-04
  • 打赏
  • 举报
回复
学习一下
mark
songfuqiang 2008-03-27
  • 打赏
  • 举报
回复
回答得很详细,学习了...
小布 2008-03-27
  • 打赏
  • 举报
回复
火龙果 您是俺偶像
cs_dubin 2008-03-18
  • 打赏
  • 举报
回复
火龙果 谢谢你
结贴了
hmsuccess 2008-03-18
  • 打赏
  • 举报
回复
谢谢火龙果
  • 打赏
  • 举报
回复
说错了,更正一下:

“(?xxx) 是非捕获组结构”改为“(?:xxx) 是非捕获组结构,仅作为纯粹的一组”。
  • 打赏
  • 举报
回复
加了 (?s) 就不用再使用 (.|\n) 了,(?s) 表示 DOTALL,这样点也能匹配换行符。

保留的意思是,在匹配到 (<script.*?/script>) 这个分组时不能删除需要保留。


[Quote=引用 27 楼 hmsuccess 的回复:]
?: *没看明白,谢谢
[/Quote]

星号前是一个空格,(?xxx) 是非捕获组结构,改成 ( *<!--.*?--> *\\n) 这样也是可
以的,但是没有必要,因为捕获组在匹配完成后会在内存中保留下来以备再次的反向引用,
由于这一块我们是需要扔掉的,所以就不要去浪费内存让它保留,使用非捕获组的结构就是
纯粹的一组,并不会在内容中保留,这样做只是降低内存占用。

想了解更多关于捕获组的知识,可以看看我的一个帖子,里面有个 Java Tutorial 中关于
正则表达式教程的译稿下载和其他的一些资源,有兴趣的话可以看看。

http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
hmsuccess 2008-03-18
  • 打赏
  • 举报
回复
火龙果老大用replaceAll方法只保留第一组,再问火龙果
?: *的含义?谢谢!
cs_dubin 2008-03-18
  • 打赏
  • 举报
回复
对了我对这里所说的“保留”的意思不是很明白
(非匹配组)不需要保留 请问 这句话是什么意思?

str = str.replaceAll(regex, "");我也是用这个来替换不在script中所有html注释

regex: (?s)(<script(.|\n)*?/script>)?(?:<!--(.|\n)*?-->*\n)?

source: <!--1-->
<script asdasd>
<!--0-->
</script>
结果: <!--1-->
<script asdasd><!--0--></script>

匹配结果有三个,不知道为什么
我用的是code Architects Regex tester

hmsuccess 2008-03-18
  • 打赏
  • 举报
回复
?: *没看明白,谢谢
  • 打赏
  • 举报
回复
$1 表示保留所匹配到的第一个捕获组,也就是表达式中带有括号的结构,
即“(xxx)”,而“(?xxx)”之类的是非捕获组。

Java 中可以保存 $1~$9 共计九个捕获组的内容,$ 结构的只能在替换
参数中使用。


“还有就是我用pattern不能匹配 <html /html>”

这个我没看明白。
hmsuccess 2008-03-18
  • 打赏
  • 举报
回复
请问:火龙果
str = str.replaceAll(regex, "$1");中的$1的作用
还有就是我用pattern不能匹配<html /html>
hmsuccess 2008-03-18
  • 打赏
  • 举报
回复
学习了
cs_dubin 2008-03-18
  • 打赏
  • 举报
回复
不晚 还在呢 呵呵
谢谢
aaaaa6794 2008-03-18
  • 打赏
  • 举报
回复
楼上的不错,学习了,现在才知道,还有 内嵌
  • 打赏
  • 举报
回复
呵呵,可能回复太晚了吧,5 天前的贴子,我昨天才看到。
  • 打赏
  • 举报
回复
这个帖有 120 分,呵呵,就应物超所值,贴个图哈。

你在 8 楼写的那个太吓人了,希望这个图能让你对正则表达式有新的认识。

  • 打赏
  • 举报
回复
public class RegexTest {

public static void main(String[] args) {
String str =
"<html\n" +
" 111111111\n" +
" <!--不要保留-->\n" +
" 222222222\n" +
" <!--不要保留-->\n" +
" <script\n" +
" 3333333333\n" +
" <!--要保留-->\n" +
" <!--要保留-->\n" +
" 4444444444\n" +
" <!--要保留-->\n" +
" /script>\n" +
" 555555555\n" +
" <!--不要保留-->\n" +
" <!--不要保留-->\n" +
" 666666666\n" +
" <script\n" +
" <!--要保留-->\n" +
" 777777777\n" +
" <!--要保留-->\n" +
" 888888888\n" +
" /script>\n" +
" <!--不要保留-->\n" +
" <!--不要保留-->\n" +
" 99999999\n" +
" <!--不要保留-->\n" +
" aaaaaaaa\n" +
" <!--不要保留-->\n" +
" bbbbbbbb\n" +
"/html>\n";

System.out.println(str);
System.out.println("-------------");

// String regex = "(?s)(<script.*?/script>)?(?:<!--.*?-->)?"; // 保留删除的那一行
String regex = "(?s)(<script.*?/script>)?(?: *<!--.*?--> *\\n)?"; // 不保留删除的那一行
str = str.replaceAll(regex, "$1");
System.out.println(str);
}
}
fx8023jo 2008-03-17
  • 打赏
  • 举报
回复
期待答案啊。
nihuajie05 2008-03-17
  • 打赏
  • 举报
回复
终于知道怎么写了...不过貌似不需要我帮忙了
加载更多回复(16)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧