ColdFusion Regex匹配精确长度的数字

dkn*_*ton 1 regex coldfusion cfml

我需要一些帮助在ColdFusion应用程序中构建正则表达式.如果有人问我,我道歉.我搜索过,但我可能不会要求正确的事情.

我使用以下内容搜索电子邮件主题行以查找问题编号:

reMatchNoCase("[0-9]{5}", mailCheck.subject)
Run Code Online (Sandbox Code Playgroud)

问题编号仅包含数字值,应精确为5位数.这是有效的,除非我在字符串中出现更长的数字,例如34512345.它还将该字符串的前5位数作为有效的问题编号.

我想要的只是检索5位数字,没有更短或更长.然后我将这些放入一个循环和处理的列表中.我是否需要在正则表达式之前和之后包含空格才能获得所需的结果?

谢谢.

Pet*_*ton 6

在匹配之前/之后排除发生内容的一般方法是在比赛之前使用负面后视,之后使用负前瞻.要对数字进行此操作将是:

(?<!\d)\d{5}(?!\d)
Run Code Online (Sandbox Code Playgroud)

(\d速记在哪里[0-9])

CF的正则表达式支持前瞻,但遗憾的是不是后视,所以这不会直接在复赛中起作用 - 但是在这种情况下这可能并不重要,因为你可能不希望,例如,abc12345匹配任何一个 - 所以你是什么更可能的是:

\b\d{5}\b
Run Code Online (Sandbox Code Playgroud)

哪里\b是"单词边界" - 粗略地说,它检查"单词字符"和非单词字符之间的变化(反之亦然) - 所以在这种情况下,第一个\b将检查在第一个[a-zA-Z0-9_]之前没有数字,第二个\b将检查第五个数字后面是否有一个数字.A \b不会在匹配中附加任何字符(即它是零宽度断言).

由于您没有处理大小写,因此您不需要nocase变量,只需编写:

rematch( '\b\d{5}\b' , mailCheck.subject )
Run Code Online (Sandbox Code Playgroud)

简单地检查空格的好处是结果是五位数(不需要修剪),但缺点是它会匹配诸如[12345]或者3.14159^2可能不是你想要的值?

要检查空格或字符串的开头/结尾,您可以执行以下操作:

rematch( '(?:^| )\d{5}(?= |$)' , mailCheck.subject )
Run Code Online (Sandbox Code Playgroud)

然后在每个结果上使用trim来删除空格.

如果那不是您所追求的,请继续并提供更多详细信息.