C#RegEx匹配特定的字符串

时间:2018-08-08 17:23:13

标签: c# regex asp.net-web-api

我需要匹配(使用正则表达式)这样的字符串:

必填: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”不匹配

有什么想法吗?

4 个答案:

答案 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+)$