决定正则表达长度

时间:2014-04-04 10:21:13

标签: regex

我想仅使用Regex完成以下要求(不能使用C#代码)

•BTN长度为12,BTN从0开始[123456789],然后它应从左侧删除一位数字,从右侧删除一位数字。 工作正确

•BTN长度为12,并且不是上述情况,那么它应该始终从开始时删除2来返回10位右数字。 (例如491234567891应更改为1234567891) 工作不正确

•BTN长度为11,应从左侧删除一位数。 工作正确

对于长度< = 10 BTNs,不需要做任何事情,它们会保持原样,或者正则表达式也可能失败,这是可以接受的。

使用SQL可以像这样实现

case when len(BTN) = 12  and BTN like '0[123456789]%' then SUBSTRING(BTN,2,10) else RIGHT(BTN,10) end

但如何使用Regex执行此操作。

到目前为止,我已经使用并且能够使用此正则表达式获得正确的结果 [0 * | \ d \ d] *(。{10})但是通过这个正则表达式我无法正确删除BTN的第一个和最后一个字符 015732888810 1573288881 因为这个正则表达式给我这个 5732888810 这是错误的

代码是

 string s = "111112573288881,0573288881000,057328888105,005732888810,15732888815,344956345335,004171511326,01777203102,1772576210,015732888810,494956345335";
        string[] arr = s.Split(',');

        foreach (string ss in arr)
        {
           // Match mm = Regex.Match(ss, @"\b(?:00(\d{10})|0(\d{10})\d?|(\d{10}))\b");

           // Match mm = Regex.Match(ss, "0*(.{10})");
          //  ([0*|\\d\\d]*(.{10}))|
            Match mm = Regex.Match(ss, "[0*|\\d\\d]*(.{10})");

          //  Match mm = Regex.Match(ss, "(?(^\\d{12}$)(.^{12}$)|(.^{10}$))");

          //  Match mm = Regex.Match(ss, "(info)[0*|\\d\\d]*(.{10}) (?(1)[0*|\\d\\d]*(.{10})|[0*|\\d\\d]*(.{10}))"); 
            string m = mm.Groups[1].Value;



            Console.WriteLine("Original BTN :"+ ss + "\t\tModified::" + m);
        }

2 个答案:

答案 0 :(得分:0)

这应该有效:

(0(\d{10})0|\d\d(\d{10}))

更新:

(0(\d{10})0|\d{1,2}(\d{10}))

第一个备用将匹配12位数,左边为0,右边为0,中间只有10个。 第二个替代将匹配11或12位数,并给你正确的10。

修改

正则表达式符合规范,但您的代码无法正确读取结果。试试这个:

Match mm = Regex.Match(ss, "(0(\\d{10})0|\\d{1,2}(\\d{10}))"); string m = mm.Groups[2].Value; if (string.IsNullOrEmpty(m)) m = mm.Groups[3].Value;

小组如下:

索引0:返回完整字符串

索引1:返回外部闭包内的所有内容

索引2:仅返回第一个备用

内闭包中匹配的内容

索引3:仅返回第二个备用

中闭包内匹配的内容

注意:这不会处理大于12位或小于11的任何内容。这些条目将失败或从某处返回10位数。如果你想要那些的结果使用这个:

"(0(\\d{10})0|\\d*(\\d{10}))"

您将获得超过12位数字的最右边10位数字,10位数字的10位数字,10位数字以外的任何数字。

修改

这个应该从评论中涵盖您的其他要求:

"^(?:0|\\d*)(\\d{10})0?$"

(?:)使得从返回的群组中排除了分组。

修改

这个可能有效:

"^(?:0?|\\d*)(\\d{10})\\d?$"

答案 1 :(得分:0)

(?(^\d{12}$)(?(^0[1-9])0?(?<digit>.{10})|\d*(?<digit>.{10}))|\d*(?<digit>.{10}))

与sql查询完全相同+始终在Group [1]中给出结果所以我没有必要更改代码:)