高分求一正则表达式 2 因第一帖问题描述不清特开第二贴

zidasine 2010-03-02 03:52:53
首先 问题: 有一段内容
内容可能是纯净的文本 或者 含有html标签
如:fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds

要实现:将html标签外的a 替换成 b 而标签体内的a 不受影响即上段内容中<font>标签中 color属性值中的字符a不能被替换
希望能给出正则表达式以及替换方法
...全文
402 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
zidasine 2010-03-04
  • 打赏
  • 举报
回复
引用 49 楼 wfeng007 的回复:
晕 弄半天不是java问题 。。。你要用在mysql环境里面阿?。。。
LZ太忽悠人了 要知道每个重则表达式环境之间都有可能不同的。。。grep vi 或者js 或者java都会有小部分区别的
反正mysql不会

java 环境和 mysql 都要用呵呵
2010-03-04
  • 打赏
  • 举报
回复
http://shiyangxt.javaeye.com/blog/293068
你可以去这里看看
wfeng007 2010-03-04
  • 打赏
  • 举报
回复
晕 弄半天不是java问题 。。。你要用在mysql环境里面阿?。。。
LZ太忽悠人了 要知道每个重则表达式环境之间都有可能不同的。。。grep vi 或者js 或者java都会有小部分区别的
反正mysql不会
岁月之梦 2010-03-03
  • 打赏
  • 举报
回复
我理解力差 还是不明白题意!
你就举例说明 原来是什么 后来变成什么不就完了!
  • 打赏
  • 举报
回复
引用 23 楼 lxcnn 的回复:
引用 20 楼 zidasine 的回复:
现在用的是Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)");
Java中不是不支持逆序环视中使用不定长度量词吗?这是哪个类库中支持的
现在没有环境,不能测试


Java 中不支持逆序环视中的不定长度量词,但这是顺序环视哦。


引用 12 楼 zidasine 的回复:
引用 10 楼 bao110908 的回复:
动动脑筋嘛,你是一碰到问题就。。。哎!

Java codestr= str.replaceAll("((?:[^<a>]*<[^<>]+>)*)a+","$1");
不想这个有问题 你吧上面 <font color="slategray">里面的a给替换了


改正了一下,这样就好了:

str = str.replaceAll("((?:[^<a>]*(?:<[^<>]+>)*)*)a+", "$1");
believefym 2010-03-03
  • 打赏
  • 举报
回复
引用 20 楼 zidasine 的回复:
现在用的是Java code Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)");
Matcher m= p.matcher(content);
m.replaceAll(replaceStr);

接下来的问题是如何将此正则转换证mysql的正则  达到同样的效果


有没有标签嵌套的情况
比如
<a>fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds</a>
-过客- 2010-03-03
  • 打赏
  • 举报
回复
这种需求在.NET中用正则+委托倒是一行代码就搞定了,不过在Java中MS没有提供这种处理方式

楼主的需求,只需考虑是否在标签内就可以了,与标签是否有嵌套没什么关系

与其局限在正则上,绕着弯去非要用正则实现,效率较低,倒不如考虑一下更好的实现方式

正则也不过是一种有穷自动机,针对这种具体需求,完全可以自己写有穷自动机来实现

String test = "fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
Boolean flag = false;
char c;
StringBuffer sb = new StringBuffer();
for(int i=0;i<test.length();i++)
{
c = test.charAt(i);
if(flag)
{
if(c == '>')
{
sb.append('>');
flag = false;
}
else
{
sb.append(c);
}
}
else
{
if(c == '<')
{
sb.append('<');
flag = true;
}
else if(c == 'a')
{
sb.append('b');
}
else
{
sb.append(c);
}
}
}
System.out.println(sb.toString());


以上代码可以更加抽象化,有时间的人优化下吧
zidasine 2010-03-03
  • 打赏
  • 举报
回复
引用 35 楼 mxm_1123 的回复:
你是不是只想找标签外的,标签内的内容全部忽略?

正事此意
mxm_1123 2010-03-03
  • 打赏
  • 举报
回复
你是不是只想找标签外的,标签内的内容全部忽略?
zidasine 2010-03-03
  • 打赏
  • 举报
回复
引用 32 楼 mxm_1123 的回复:
select * from tablename where username REGEXP ' <[^>]*(a)[^ <]*>'
你试了吗?没试可别这么说

这一种我最开始就试了 完全相同的写法,这个是标签体内体外的都找了 而且找的不是很正确
shatangju8801 2010-03-03
  • 打赏
  • 举报
回复
学过 但是 没用过 正则表达式
mxm_1123 2010-03-03
  • 打赏
  • 举报
回复
select * from tablename where username REGEXP ' <[^>]*(a)[^ <]*>'
你试了吗?没试可别这么说
zidasine 2010-03-03
  • 打赏
  • 举报
回复
引用 29 楼 mxm_1123 的回复:
to27楼,你那么写是替换里面的,你试试就知道了,应该是Pattern p = Pattern.compile("( <[^>]*)(a)([^ <]*>)");
mysql查询方法:select * from tablename where username REGEXP ' <[^>]*(a)[^ <]*>'
你可以自己在改改,解决了就结贴吧
你这个明显是找到<.a.>这个的不符合需求
mxm_1123 2010-03-03
  • 打赏
  • 举报
回复
验证了一下,是外面的
mxm_1123 2010-03-03
  • 打赏
  • 举报
回复
to27楼,你那么写是替换里面的,你试试就知道了,应该是Pattern p = Pattern.compile("(<[^>]*)(a)([^<]*>)");
mysql查询方法:select * from tablename where username REGEXP '<[^>]*(a)[^<]*>'
你可以自己在改改,解决了就结贴吧
zm_hs 2010-03-03
  • 打赏
  • 举报
回复
正则表达式不怎么会啊!!!!
zidasine 2010-03-03
  • 打赏
  • 举报
回复
引用 26 楼 mxm_1123 的回复:
你后面的表达不是很清楚,再说
Pattern p= Pattern.compile("(?! <[^>]*)(a)(?![^ <]*>)"); 是替换标签中的a呀,你到底要替换哪个,外面的或里面的
替换的是标签外的a (?! <[^>]*)这个应该是非捕获的
mxm_1123 2010-03-03
  • 打赏
  • 举报
回复
你后面的表达不是很清楚,再说
Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)"); 是替换标签中的a呀,你到底要替换哪个,外面的或里面的
zidasine 2010-03-03
  • 打赏
  • 举报
回复
引用 23 楼 lxcnn 的回复:
引用 20 楼 zidasine 的回复:
现在用的是Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)");

Java中不是不支持逆序环视中使用不定长度量词吗?这是哪个类库中支持的

现在没有环境,不能测试

用的是java.util.regex
加载更多回复(31)

81,095

社区成员

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

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