问题描述
高手们请看。有个关于正则表达式的问题。太苦恼了问题如下需要转变的字符串举例:a/123= b/456a/123= b/456+ c/789a/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"的话需要保留。不进行替换。我就不会了。看了看非获取匹配还是不行。请高手们解答 问题补充:首先谢谢这位同事,谢谢您的帮助。您写的"\s[a-zA-Z]*?/|^[a-zA-Z].*?/"是不是说:以空白开头到/结尾或者以字母开头以/结尾的字符都替换成空我试了试,非常好。但是是我开始描述不清,怨我了。我的入力数据还是有点出入。我的入力数据其实是这样的1: 成员表:m2/年龄== "32"2: 成员表:m2/姓名== 库存表/姓名 or 管理表/姓名3: 成员表:m2/更新日期== todata(系统日, "YYYY/MM/DD")转变后1: 年龄== "32"2: 姓名== 姓名 or 姓名3: 更新日期== todata(系统日, "YYYY/MM/DD")这位高手能再看看么,我实在想不出来了最开始我是想问问,正则表达式中有没有一种概念,就是某某字符在匹配的时候,可以规定,其中某部分可以不被替换。不过您可以不用回答这个问题,帮我解决就可以了。谢谢了。
解决方案
边界到/符号前边的内容删除,通过你的例子的理解是:1.以空白字符开始到/的内容2.句首以字符开始到/的内容下面的代码为测试,通过public class T {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString 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, ""));}}
解决方案二:
简单的办法:先把YYYY/MM/DD替换成YYYY@MM@DD,然后用正则正常替换,然后YYYY@MM@DD再替换回来,
解决方案三:
说实话,还是没看懂你要什么,不知道这个是不是你要的
解决方案四:
public static void main(String[] args) {List<String> list=new ArrayList<String>();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);}}}}
解决方案五:
成员表:m2/年龄== "32" 成员表:m2/姓名== 库存表/姓名 or 管理表/姓名 成员表:m2/更新日期== todata(系统日, "YYYY/MM/DD") 这是3条数据是吧?
解决方案六:
什么叫不匹配的功能[^.......]就不匹配里面的内容了,匹配的是除了里面的东西或者(?<!)和(?!),这种形式不占用字符
解决方案七:
加一个预处理,先把不要匹配到的文本替换成其它字符串,如先把YYYY/MM/DD替换成YYYY$$MM$$DD,最后在替换回来。
解决方案八:
晚上终于有时间了其实把那个简单的改一下就好,如下:String regex = "成员表:|[^("YYYY/MM/DD")][a-zA-Z0-9u2E80-u9FFF]*?/";呵呵~~忙碌了一个小时测试代码:public class T {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString regex = "成员表:|[^("YYYY/MM/DD")][a-zA-Z0-9u2E80-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, ""));}}
解决方案九:
先前那段代码p1不稳定 定义成这样:Pattern p1=Pattern.compile("(?i)todata\(.+?\)");这个问题不跟帖了 还有问题的话 直接消息我 其实我对你的需求还是不明确 肯定有变通的更好的实现方法的
解决方案十:
想了下 好难
解决方案十一:
你的数据是带序号 1: 年龄== "32" 2: 姓名== 姓名 or 姓名 3: 更新日期== todata(系统日, "YYYY/MM/DD") ???还是不带序号年龄== "32" 姓名== 姓名 or 姓名 更新日期== todata(系统日, "YYYY/MM/DD") ???还是1: 年龄== "32" ------------------------另外一条2: 姓名== 姓名 or 姓名 ------------------------另外一条3: 更新日期== todata(系统日, "YYYY/MM/DD") 单条分开的???
解决方案十二:
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();}