regex在字符串中查找一个或两个数字,但不查找三个数字

nfg76nw0  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(83)

我想找到匹配:
\024jack3hall2\c$
\024jack3hall02\c$
\024jack3hall12\c$
但不适用于:
\024jack3hall023\c$
差异是结束部分的位数。我只想要一个或两个,而不是三个。
我的尝试:

\\\\024[a-zA-Z0-9]+[0-9]{1,2}\\[a-zA-Z]{1}\$(?!.)

字符串
我只在http://regexr.com/上尝试过,但将在C#中实现。
是否可以编辑我的尝试,或者我必须写几个单独的检查?为什么

{1,2}


不工作?\024jack3hall12343\c$也匹配,

mzsu5hc0

mzsu5hc01#

从 * 您所展示的示例 * 中,可以看到如下简单的内容:

[^\d](\d{1,2})\\

字符串
应该有用。它将匹配1或2个数字,然后是\,只要它没有被另一个数字继续。如果需要,匹配的数字位于捕获组中(如果不需要,也可以删除方括号)。
至于你最初的努力,就在这里:

\\\\024[a-zA-Z0-9]+[0-9]{1,2}


您正在匹配范围a-zA-Z0-9中的1个或多个。所以如果你的多余的数字出现在这个模式的末尾,它就会和你的多余的数字相匹配。

w8ntj3qf

w8ntj3qf2#

答:

\\\\024[a-zA-Z0-9]+[^\d](\d{1,2})\\[a-zA-Z]{1}\$(?!.)

字符串

anauzrmj

anauzrmj3#

我相信你没有正确地转义反斜杠。下面是正确的正则表达式:

\\024[a-zA-Z0-9]+[0-9]{1,2}\\[a-zA-Z]{1}\$(?!.)

字符串

zpqajqem

zpqajqem4#

  • 限制模式内特定数量的数字的一般想法 * 是通过使用数字边界
(?<!\d)\d{min,max}(?!\d)

字符串
因此,要匹配一个或两个数字,而不是三个数字,您可以使用(?<!\d)\d{1,2}(?!\d)或仅ASCII版本(?<![0-9])[0-9]{1,2}(?![0-9])
当然,如果数字模式之前或之后有非数字匹配模式,则不需要这些边界。例如[a-zA-Z]+\d{min,max}\s+\w+。当然,[a-zA-Z]\s都不匹配数字,因此与\d{min,max}匹配的数字数量被安全地限制在指定的值内。
现在,当前OP解决方案如下所示

\\\\024[a-zA-Z0-9]*[a-zA-Z][0-9]{1,2}\\[a-zA-Z]\$
\\\\024[a-zA-Z0-9]+(?<![0-9])[0-9]{1,2}\\[a-zA-Z]\$


第一个确保了正确的数字数量,因为[a-zA-Z0-9]+(一个或多个字母或数字)被转换为[a-zA-Z0-9]*[a-zA-Z](零个或多个字母或数字,然后是一个字母)。参见regex demo
第二个使用左侧数字边界(?<![0-9])。请注意,(?<!\d)也可以安全地在这里使用。没有必要使用右手数字边界,因为\\模式只匹配反斜杠(不能匹配数字)。参见regex demo

相关问题