如何使regex在特定位置可选?

如何使regex在特定位置可选?,regex,coldfusion,Regex,Coldfusion,我有检查多个列值的正则表达式列表。列由制表符分隔符分隔。我有32列是必需的,另外12列是可选的。所以,如果我的文件总共有44列,我需要运行整个列表,但如果我只有32列,那么我想让列表的其余部分成为可选的。这是我的正则表达式: <cfset myRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[

我有检查多个列值的正则表达式列表。列由制表符分隔符分隔。我有32列是必需的,另外12列是可选的。所以,如果我的文件总共有44列,我需要运行整个列表,但如果我只有32列,那么我想让列表的其余部分成为可选的。这是我的正则表达式:

<cfset myRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t([^\t]*)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z0-9 '-.;]{1,100}|NULL)\t([A-Za-z '-]{1,50}|NULL)\t(\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\d+|NULL)\t([A-Za-z '-]{1,50}|NULL)\t((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL)\r?$">
这也不管用

数据示例:

<cfset myData = "Ruiz   John    09/01/1984  M   00  Red Star    player  3345678879  0   0   0   0   0   1                   0   0   0       0   0   0   0   0       19234   1011    0089    01">

<cfif REFind(fileRegex,myData,true) GT 0>
    true<br>
<cfelse>
    false<br>
</cfif>

正确


将可选列的regex(和一个\t)用括号()括起来,然后添加?最后,您的固定正则表达式是

^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t[^\t]*(\t([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$
这个


有一个
\t
需要从
([^\t]*)\t)移动到
([A-Za-z'-]{1,20}NULL)\t)
(=>
(\t([A-Za-z'-]{1,20}NULL)\t)
)可选组。

您的正则表达式包含24
\t
。实际上,不清楚您需要什么,并且该模式太长,如果没有示例字符串就无法调试。@WiktorStribiżew如果您仔细查看第7个\t I(\t[^\t]*){22},它表示22个不应包含\t的列。我没有对这些字段使用任何严格的验证。只是确保它们没有制表符。请尝试该表达式。我假设你的正则表达式几乎是正确的(真的,我不知道如何正确地调试它,除了你之外没有人可以),我只是找到了一个地方,
\t
被放在必选组中,而它必须是可选组的一部分(也许,我没有所有必要的数据)。@WiktorStribiżew我测试过,工作正常。谢谢你的帮助!(和一个\t)?我是否应该在每列/regex后面包含\t?是的,因为如果您将regex部分设置为可选部分,您将得到两个选项卡(\t)我更新了我的问题。我试过了,但没有成功。也许我的代码有问题。你有一组数据可以用来测试正则表达式吗?我会在我的问题中放一行代码和数据。
^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t[^\t]*(\t([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$