我需要匹配(使用正则表达式)这样的字符串:
必填:custodian_ {number 1-9} _ {fieldType txt或ssn} 可选:_ {fieldLength 1-999}
例如: custodian_1_ssn_1有效 custodian_1_ssn_1_255有效
保管人或保管人_或保管人_1或保管人_1_或保管人_1_ssn或保管人_1_ssn_或保管人_1_ssn_1_无效
当前,我正在处理此问题:
(?:custodian|signer)_[1-9]?[0-9]_(?:txt|ssn)_[1-9][0-9]?(_[1-9]?[0-9]?[0-9]?)?
由于我的正则表达式和我的api正在努力获取: custodian_1_txt_1 custodian_1_ssn_1 custodian_1_txt_1_25 5 <----与最后一个“ 5”不匹配
有什么想法吗?
答案 0 :(得分:1)
您可以使用模式:
^custodian(?:_[a-z0-9]+)+$
^
声明行首的位置。custodian
匹配文字子串custodian
。(?:_[a-z0-9]+)+
非捕获组。 _
的多个序列,后跟字母数字。$
声明行尾位置。您可以检查正确的匹配项here。
很明显,您可以修改模式以在非捕获组中添加子字符串signer
为:
^(?:custodian|signer)(?:_[a-z0-9]+)+$
。
答案 1 :(得分:1)
我建议使用\d
而不是您的数字,这是我的代码尝试:-
(?:custodian|signer)_[1-9]?[0-9]_(?:txt|ssn)_[1-9][0-9]?(_[1-9]?\d*)?
我刚刚在您的模式末尾添加了一个\d
值,以便在所有匹配项之前都匹配所有结束位。
答案 2 :(得分:1)
您可以使用锚点来声明字符串的开头^
和结尾$
,最后一部分至少使前1-9个不是可选的,否则它将匹配并加下划线最后:
^(?:custodian|signer)_[1-9]?[0-9]_(?:txt|ssn)_[1-9][0-9]?(_[1-9][0-9]?[0-9]?)?$
答案 3 :(得分:1)
如果您只对最后一位数字感兴趣,那么此超级通用正则表达式将:
(?:.+)_(\d+)
如果您确实需要匹配整个字符串,则可以这样做:
^(?:custodian|signer)_\d+_(?:txt|ssn)(?:_\d+)?_(\d+)$