-1

图案

^\\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 位数字。我错过了什么?

4

2 回答 2

1

对不起所有的混乱,也很明显撒谎了一大堆。您遇到的问题是您在几个您不想使用的地方使用精确量词,即{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})。我猜这只是写出问题时的一个错字,因为当您尝试以其他方式使用它时,您现在拥有的内容会在运行时爆炸,而且听起来它对您的某些输入有效。

于 2013-08-28T21:15:44.523 回答
1
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 // 为了使它们工作,请特别注意语法。

于 2013-08-28T21:16:14.960 回答