首先 问题: 有一段内容
内容可能是纯净的文本 或者 含有html标签
如:fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds 要实现:将html标签外的a 替换成 b 而标签体内的a 不受影响即上段内容中<font>标签中 color属性值中的字符a不能被替换
希望能给出正则表达式以及替换方法
内容可能是纯净的文本 或者 含有html标签
如:fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds 要实现:将html标签外的a 替换成 b 而标签体内的a 不受影响即上段内容中<font>标签中 color属性值中的字符a不能被替换
希望能给出正则表达式以及替换方法
这里面的两个a也要换掉么?
StringBuffer sb=new StringBuffer();
Pattern p = Pattern.compile("<[^>]*>");
String s="fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
String[] splits=p.split(s+" ");//结尾加空格,最后是标签;
Matcher m=p.matcher(s);
int i=0;
if(s.charAt(0)!='<' && splits.length>0){
sb.append(splits[0].replaceAll("a","A"));
i++;
}
while (m.find()) {
sb.append(m.group()+splits[i++].replaceAll("a","A"));
}
System.out.println(sb.toString());
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());以上代码可以更加抽象化,有时间的人优化下吧
为啥这个非要用正则表达式?
用个stack不就好了读到"<" ">"就放入stack 如果stack顶部为“>”遇到“a”则替换...超级简单的词法解析
//替换
char[] chars=str.toCharArray();
Stack<Character> stack=new Stack<Character>(); //可以改良stack实现来优化性能
for (int i = 0; i < chars.length; i++) { //简单过滤<...>标签 需要的话增加该词法解析的功能
switch(chars[i]){
case '<' :
stack.push('<');break;
case '>' :
if(stack.peek()=='<')stack.pop();break;
case 'a' :
if(stack.isEmpty()==true)chars[i]='b';break;
default:
break;
}
}
//显示
System.out.println(new String(chars));
String str="fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
//替换
char[] chars=str.toCharArray();
Stack<Character> stack=new Stack<Character>(); //可以改良stack实现来优化性能
for (int i = 0; i < chars.length; i++) { //简单过滤<...>标签 需要的话增加该词法解析的功能
switch(chars[i]){
case '<' :
stack.push('<');break;
case '>' :
if(stack.peek()=='<')stack.pop();break;
case 'a' :
if(stack.isEmpty()==true)chars[i]='b';break;
default:
break;
}
}
//显示
System.out.println(new String(chars));
Matcher m = p.matcher(content);
m.replaceAll(replaceStr);接下来的问题是如何将此正则转换证mysql的正则 达到同样的效果
Java中不是不支持逆序环视中使用不定长度量词吗?这是哪个类库中支持的现在没有环境,不能测试
这个不大清楚 找的是php里用的一段正则修改的 测试可用
Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)"); 是替换标签中的a呀,你到底要替换哪个,外面的或里面的
mysql查询方法:select * from tablename where username REGEXP '<[^>]*(a)[^<]*>'
你可以自己在改改,解决了就结贴吧
你试了吗?没试可别这么说
有没有标签嵌套的情况
比如
<a>fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds</a>
Java 中不支持逆序环视中的不定长度量词,但这是顺序环视哦。改正了一下,这样就好了:str = str.replaceAll("((?:[^<a>]*(?:<[^<>]+>)*)*)a+", "$1");
因为按正则表达式本身的要求,后面必须接a才能匹配,所以这一判断是肯定满足的,从语法角度分析,这个就是没意义的其实楼主的这个需求简单,如果能保证源字符串中的标签都闭合,下面的就可以了,这个基本上是所有语言中都通用的
str = str.replaceAll("a(?![^<>]*<)", "b");
39#和41#朋友的表达式 还有点问题 呵呵现在的问题 如何将 (?!<[^>]*)(a)(?![^<]*>) 转换成mysql能识别的表达式
or (uname not regexp '(<[^>]*>)+' and uname LIKE '%a%')
select * from a where uname REGEXP '(<[^>]*>)+[^>]*a'
or (uname not regexp '(<[^>]*>)+' and uname LIKE '%a%')
转换成mysql 可用的正则依然无结果 mysql区的贴一天了0回复绕行了
LZ太忽悠人了 要知道每个重则表达式环境之间都有可能不同的grep vi 或者js 或者java都会有小部分区别的
反正mysql不会
你可以去这里看看