请教正则表达式筛选不匹配某些字符串问题

zjnuan 2015-06-13 09:48:23
我的源文件内容都是含有类似“150530年全”的字眼,就是日期格式“yyMMdd”后加2个中文的格式,我要筛选剩下近2年即15年和14年开头的字眼,如“150530年全”,我用到了Regex.Replace(s, replace, ""),s为我的源文件字符串,replace为我想要的正则表达式。replace不知道怎样写,后面匹配6个字符部分我想到了“\d{4}[^0-9][^0-9]”,前面2个字符就实在难想出。在此请教大家。
...全文
834 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjnuan 2015-06-21
  • 打赏
  • 举报
回复
引用 14 楼 zjnuan 的回复:
用了2楼的表达式,再用到Regex.Matches方法遍历成员再拼接成字符串解决,有点曲折,没有办法之中的办法。我用的是VB.NET,C#的思路一样。谢谢各位。代码如下:

        i = Today.ToString.Substring(2, 2)
            For Each drdr As DataRow In 用户列表.DataSource.rows
                s = ""
                For Each match As Match In Regex.Matches(n2s(drdr("请假详情")), "[" & i - 1 & "|" & i & "]{2}\d{4}[\u4e00-\u9fa5]{2}")
                    s &= match.Value
                Next
                drdr("请假详情") = s
            Next
正则表达式改为"(" & Format(i - 1, "00") & "|" & Format(i, "00") & ")\d{4}[\u4e00-\u9fa5]{2}"才对,n2s()是我定义的函数,是返回字符串的。
  • 打赏
  • 举报
回复

var str='000131年全080916年上100325年下141228事全150530年全170809事全180903事下';
str=str.replace(/(?!1[45])\d{2}[01]\d[0123]\d[\u4e00-\u9fa5]{2}/g,'');
alert(str);
zjnuan 2015-06-15
  • 打赏
  • 举报
回复
用了2楼的表达式,再用到Regex.Matches方法遍历成员再拼接成字符串解决,有点曲折,没有办法之中的办法。我用的是VB.NET,C#的思路一样。谢谢各位。代码如下:

        i = Today.ToString.Substring(2, 2)
            For Each drdr As DataRow In 用户列表.DataSource.rows
                s = ""
                For Each match As Match In Regex.Matches(n2s(drdr("请假详情")), "[" & i - 1 & "|" & i & "]{2}\d{4}[\u4e00-\u9fa5]{2}")
                    s &= match.Value
                Next
                drdr("请假详情") = s
            Next
  • 打赏
  • 举报
回复
引用 12 楼 starfd 的回复:
1[45]\d{4}.{2}
然后再对Match的值进行判断
(1[45]\d{4}).{2}
对match.Group[1].Value进行ParseDate判断
  • 打赏
  • 举报
回复
1[45]\d{4}.{2}
然后再对Match的值进行判断
网络菜鸟00 2015-06-15
  • 打赏
  • 举报
回复
([01236789]+\d{4}[\u4e00-\u9fa5]{2})
zjnuan 2015-06-14
  • 打赏
  • 举报
回复
hironpan朋友的截图的软件我也有,但结果不是我想要的,我在1楼的内容表达可能没说清楚。
zjnuan 2015-06-14
  • 打赏
  • 举报
回复
我举个例子,原来字符串s=“000131年全080916年上100325年下141228事全150530年全170809事全180903事下”,使用s=Regex.Replace(s, 正则表达式, "")后,s=“141228事全150530年全”,就是筛选出开头为今年或去年后面2位数的格式字眼,这个格式字眼为yyMMdd后加2个中文字。
zjnuan 2015-06-13
  • 打赏
  • 举报
回复
引用 2 楼 vbload 的回复:
(1[4|5]\d{4}[\u4e00-\u9fa5]{2}) 这样试试。
我想要的效果是要跟你这个刚刚相反的,因为我要用到Regex.Replace后保留14或15开头的字眼。是不是要在前面加多个^?
皮特胖胖 2015-06-13
  • 打赏
  • 举报
回复
可以正常匹配啊。。


(?<=1[45])表示匹配一个位置,该位置前面是14或15

string oldStr = "140530年全";
string newStr = Regex.Replace(oldStr, "(?<=1[45])\\d{4}[\\u4e00-\\u9fa5]{2}", "替换内容");
MessageBox.Show ("替换前的字符串:" + oldStr + Environment .NewLine + "替换后的字符串:" + newStr);
网络菜鸟00 2015-06-13
  • 打赏
  • 举报
回复
引用 5 楼 zjnuan 的回复:
不行哦,如果做到2楼的相反效果就行了。不知如何写。
与其替换掉,为什么不直接取2楼的匹配结果呢?
网络菜鸟00 2015-06-13
  • 打赏
  • 举报
回复
引用 5 楼 zjnuan 的回复:
不行哦,如果做到2楼的相反效果就行了。不知如何写。
是你表达不清。 (1[01236789]\d{4}[\u4e00-\u9fa5]{2}) 这样试试吧,我只是瞎写写……
网络菜鸟00 2015-06-13
  • 打赏
  • 举报
回复
(1[4|5]\d{4}[\u4e00-\u9fa5]{2}) 这样试试。
zjnuan 2015-06-13
  • 打赏
  • 举报
回复
不行哦,如果做到2楼的相反效果就行了。不知如何写。
皮特胖胖 2015-06-13
  • 打赏
  • 举报
回复

(?<=1[45])\d{4}[\u4e00-\u9fa5]{2}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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