我想仅使用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);
}
答案 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]中给出结果所以我没有必要更改代码:)