急,关于java正则表达式的问题。

高手们请看。有个关于正则表达式的问题。太苦恼了
问题如下
需要转变的字符串举例:
a/123= b/456
a/123= b/456+ c/789
a/123= todata(b)

把 a/123= b/456

变成 123= 456

把 a/123= b/456+ c/789
变成 123=456+789

把 a/123= todata(b)
变成 123=todata(b)
以上我都实现了: replaceAll("\b\S*?/", "")

但是突然出了个异常数据就挂了
把 a/123= todata(b,"YYYY/MM/DD")
变成 123= todata(b,"YYYY/MM/DD")

高手们明白我的意思么:就是把边界到/符号前边的内容删除。但是有"YYYY/MM/DD"的话需要保留。不进行替换。
我就不会了。看了看非获取匹配还是不行。请高手们解答

边界到/符号前边的内容删除,通过你的例子的理解是:

1.以空白字符开始到/的内容
2.句首以字符开始到/的内容

下面的代码为测试,通过

[code="java"]
public class T {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub


    String regex = "\\s[a-zA-Z]*?/|^[a-zA-Z].*?/";

// String s = "a/123= b/456+ c/789";

// String s = "a/123= todata(b)";

    String s = "a/123 = todata(b,\"YYYY/MM/DD\")";  

    System.out.println(s.replaceAll(regex, ""));


}

}
[/code]

[code="java"]
String str=" 成员表:m2/年龄== \"32\" " +
" 成员表:m2/姓名== 库存表/姓名 or 管理表/姓名 "+
" 成员表:m2/更新日期== todata(系统日, \"YYYY/MM/DD\") ";
str+=" xx:xx/xx==";
Pattern p=Pattern.compile("(?s)[^ :]+:[^/]+/([^=]+)==(.+?)(?=[^ :]+:[^/]+/([^=]+)==)");
Pattern p1=Pattern.compile("(?i)todata\([^,]+ *, *\"YYYY/MM/DD\"\)");
Matcher m=p.matcher(str);
while(m.find()){
System.out.print(m.group(1)+"==");
if(p1.matcher(m.group(2)).find()){
System.out.print(m.group(2));
}else{
System.out.print(m.group(2).replaceAll("\S+/", ""));
}
System.out.println();
}
[/code]

你的数据是带序号

1: 年龄== "32"
2: 姓名== 姓名 or 姓名
3: 更新日期== todata(系统日, "YYYY/MM/DD")
???

还是不带序号
年龄== "32"
姓名== 姓名 or 姓名
更新日期== todata(系统日, "YYYY/MM/DD")
???
还是
1: 年龄== "32"
------------------------另外一条
2: 姓名== 姓名 or 姓名
------------------------另外一条
3: 更新日期== todata(系统日, "YYYY/MM/DD")
单条分开的
???

想了下 好难

先前那段代码p1不稳定
定义成这样:

[code="java"]
Pattern p1=Pattern.compile("(?i)todata\(.+?\)");
[/code]
这个问题不跟帖了 还有问题的话 直接消息我
其实我对你的需求还是不明确 肯定有变通的更好的实现方法的

晚上终于有时间了

其实把那个简单的改一下就好,如下:

String regex = "成员表:|[^(\"YYYY/MM/DD\")][a-zA-Z0-9\u2E80-\u9FFF]*?/";

呵呵~~忙碌了一个小时

测试代码:

[code="java"]

public class T {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    String regex = "成员表:|[^(\"YYYY/MM/DD\")][a-zA-Z0-9\u2E80-\u9FFF]*?/";

     String s = "1:   成员表:m2/年龄== \"32\" ";

// String s = "2: 成员表:m2/姓名== 库存表/姓名 or 管理表/姓名 ";

// String s = "3: 成员表:m2/更新日期== todata(系统日, \"YYYY/MM/DD\")";

    System.out.println(s.replaceAll(regex, ""));

}

}

[/code]

加一个预处理,先把不要匹配到的文本替换成其它字符串,如先把YYYY/MM/DD替换成YYYY$$MM$$DD,最后在替换回来。

什么叫不匹配的功能
[^.......]就不匹配里面的内容了,匹配的是除了里面的东西
或者(?<!)和(?!),这种形式不占用字符

成员表:m2/年龄== "32"

成员表:m2/姓名== 库存表/姓名 or 管理表/姓名

成员表:m2/更新日期== todata(系统日, "YYYY/MM/DD")

这是3条数据是吧?

[code="java"] public static void main(String[] args) {
List list=new ArrayList();
list.add("成员表:m2/年龄== \"32\"");
list.add("成员表:m2/姓名== 库存表/姓名 or 管理表/姓名");
list.add("成员表:m2/更新日期== todata(系统日, \"YYYY/MM/DD\") ");

    Pattern regex1 = Pattern.compile("[^/]+==\\s*(\"\\d+\"|todata\\(系统日,\\s*\"YYYY/MM/DD\"\\))", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Pattern regex2 = Pattern.compile("([^/]+==\\s*)[^/]+/([^/]*?\\s*or\\s*)[^/]*/([^/]*)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    for (String string : list) {
        Matcher regexMatcher1 = regex1.matcher(string);
        String reg2="";
        if(regexMatcher1.find()){
            System.out.println(regexMatcher1.group());
        }else{
            Matcher regexMatcher2 = regex2.matcher(string);
            if(regexMatcher2.find()){
                String s=regexMatcher2.group(1)+regexMatcher2.group(2)+regexMatcher2.group(3);
                System.out.println(s);
            }
        }
    }
}[/code]

说实话,还是没看懂你要什么,不知道这个是不是你要的

简单的办法:

先把YYYY/MM/DD替换成YYYY@MM@DD,然后用正则正常替换,然后YYYY@MM@DD再替换回来, :lol: :lol: :lol: