图案
^\\d{1}-\\d{10}|\\d{1,9}|^TWC([0-9){12})$
应该验证这些
1-23232445
1-232323
1-009121212
12
12222
TWC12222
TWC1222324
当我测试 TWC 模式不匹配时,我添加了“|” 考虑 OR 条件,然后有 0-9 之间的数字,但限制为 12 位数字。我错过了什么?
对不起所有的混乱,也很明显撒谎了一大堆。您遇到的问题是您在几个您不想使用的地方使用精确量词,即{10}
and {12}
。这需要在这些位置恰好十或十二位数。你大概想要的是那些{1,10}
分别{1,12}
。
我会做的是这样的事情,使用括号和量词来清理所有内容并尽可能少地重复自己,以避免混淆。你有三个可能的前缀(一个数字和一个破折号,或者“TWC”,或者什么都没有)。我会把这些可能性放在一起,然后添加其余的。这使得正则表达式更容易查看。
^(\\d-|TWC){0,1}\\d{1,12}$
细分:
^
是在开始,总是。
(\\d-|TWC){0,1}
接下来是一个数字,后跟一个破折号,或者是字符串"TWC"
。此前缀出现零次(无前缀)或出现一次。
\\d{1,12}$
最后,有一个 1 到 12 位数字的字符串,然后是行尾/输入(当然取决于您的 DOTALL 设置)。
当然,如果不同的前缀只能允许特定数量的数字,您将无法将其简化这么多,但这是基本思想。
你也有看起来像错字的东西;TWC([0-9){12})
应该是TWC([0-9]{12})
。我猜这只是写出问题时的一个错字,因为当您尝试以其他方式使用它时,您现在拥有的内容会在运行时爆炸,而且听起来它对您的某些输入有效。
TWC([0-9)
我认为这是它可能不起作用的地方?
你需要
TWC([0-9]{12})
完整答案...
(\d{1}-\d{1,12})|^TWC(\d{1,12})$
更好的答案..
^(\\d-|TWC|)(\\d{1,12})$ // this syntax i believe will match your needs.
测试:)
^([0-9]-|TWC|)([0-9]{1,12})$ // or
^(\d-|TWC|)(\d{1,12})$
分解
^
这表示字符串的开始
\d or [0-9]
表示数字 0 到 9 中的一个字符(注意 \d 在某些语言中可能不起作用或需要不同的语法!)
|
本质上是一个 OR
{1,12}
只会接受特定模式 1-12 次,例如在我的代码中,模式应该是 \d 或 [0-9]
$
是行尾
这实质上检查该行是否包含带有 - 之后的 [0-9],TWC,或者只是一个空空间以说明在开始时没有任何内容,然后读取最多 12 位数字。应该适用于您的所有情况。
测试
所有单元测试。如果您想查看它们,请单击“java”:0
笔记:
您需要查看您在某些情况下使用的语法,您可能需要 \Somethings 才能使它们工作。在 C++/C 中,它的 2 // 为了使它们工作,请特别注意语法。