Regex 正则表达式长度的确定

Regex 正则表达式长度的确定,regex,Regex,我只想使用正则表达式来完成以下要求(不能使用C#代码) •BTN长度为12,BTN从0[123456789]开始,然后应从左移一位,从右移一位。 工作正常 •BTN长度为12,而不是上述情况,则应通过从开始处删除2,始终返回10个右数字。(例如,应将491234567891更改为1234567891) 工作不正常 •BTN长度为11,应从左侧删除一个数字工作正常 对于长度而言,这应该有效: (0(\d{10})0|\d\d(\d{10})) 更新: (0(\d{10})0|\d{1,2}(\d

我只想使用正则表达式来完成以下要求(不能使用C#代码)

•BTN长度为12,BTN从0[123456789]开始,然后应从左移一位,从右移一位。 工作正常

•BTN长度为12,而不是上述情况,则应通过从开始处删除2,始终返回10个右数字。(例如,应将491234567891更改为1234567891) 工作不正常

•BTN长度为11,应从左侧删除一个数字工作正常

对于长度而言,这应该有效:

(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}));
字符串m=mm.Groups[2]。值;
if(string.IsNullOrEmpty(m))
m=mm.组[3].值

分组如下:

索引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?$”
(?(^\d{12}$)(?(^0[1-9])0?(?{10})\\d*(?{10}))\d*(?{10}))

它的功能与sql query+始终在组[1]中给出结果完全相同,因此我不必对代码进行任何更改:)

显示运行我正在使用的regex…添加的代码的代码/命令。返回除015732888810之外的所有正确值。我只想在Regex中实现一个类似上面SQL查询的条件检查。因此,如果长度为12或11,我可以决定要做什么,或者你也应该在回答的同时添加一个解释,以便OP了解发生了什么。谢谢。嗨,我也试过了,但也不起作用,你能帮我检查一下我粘贴的代码吗。我想只要稍加调整,这就行了。我会很感激你没有说如何处理13个数字这太好了。但是有没有一种方法可以将它们放在组[1]中,因为我无法更改我将要使用的应用程序中的代码,并且在我的应用程序中我已经阅读了组[1],所以我现在无法更改。那么,如果期望的结果可以在组[1]中,有没有办法?这一个05732888105没有正确更改,因为这应该是5732888810(如果是0[123456789],请删除第一个数字,然后取10个数字)。另外,这一个057328881000(13个数字)是5732888810,而不是最右边的10个数字,因为这是32881000
(0(\d{10})0|\d\d(\d{10}))
(0(\d{10})0|\d{1,2}(\d{10}))
(?(^\d{12}$)(?(^0[1-9])0?(?<digit>.{10})|\d*(?<digit>.{10}))|\d*(?<digit>.{10}))