1

我是正则表达式的新手,并尝试使用正则表达式匹配以下模式:

  1. 一组数字,每个看起来都像 12 这样的单个数字,或者像 19-39 这样的数字范围
  2. 组由分号 (;) 分隔
  3. 所有数字都在 1-48 范围内(但我们不需要在正则表达式中验证这一点)

所以一个示例匹配是 12;13;19-39;43

对于单个组,我可以考虑使用

\b[1-9]{1}|[1-9]{1}[0-9]{1}\b

对于单个号码,和

\b[1-9]{1}|[1-9]{1}[0-9]{1}-[1-9]{1}|[1-9]{1}[0-9]{1}\b

对于数字范围。

问题是如何同时考虑分号(;):由 ; 连接的上述任意数量的数字组。可以匹配。

4

3 回答 3

1

这应该完全符合您的要求:

\d*[0-9](|-\d*[0-9]|;\d*[0-9])*$

解释:

  1. 多次匹配任何数字。
  2. 接下来,检查 a -or;后跟另一系列数字。

重复此操作,直到找到匹配项。

在这里尝试一下:

http://gskinner.com/RegExr/

您可以将示例文本粘贴到大文本区域并查看 exp 的运行情况。干杯!

于 2013-08-31T04:29:48.233 回答
0

学习这些的一个技巧是尝试将其分解为部分并编写残酷的部分开始:

  1. 1-48 单独以 ; 你可以很复杂:((\d)|([1-3]\d)|(4[0-8]));
  2. 对于虚线组,只需用破折号重复相同的组件:((\d)|([1-3]\d)|(4[0-8]))-((\d)|([1-3]\d)|(4[0-8]));
  3. 现在组合得到/或并重复整个组:((((\d)|([1-3]\d)|(4[0-8]));)|(((\d)|([1-3]\d)|(4[0-8]))-((\d)|([1-3]\d)|(4[0-8]));))*

现在我们有了这个粗暴的正则表达式,上面有很多荒谬的分组,但它确实有效。接下来我们可以考虑简化,你有一个更好的地方(有点)开始寻求帮助。

打算开始简化,但你已经在这里有了其他答案。

稍微简化一下,只需注意您的最终数字不会以分号结尾,您可以从合并 @Sunny 之类的内容开始:

^((\d)|([1-3]\d)|(4[0-8]))(|-((\d)|([1-3]\d)|(4[0-8]))|;((\d)|([1-3]\d)|(4[0-8])))*$
于 2013-08-31T04:35:22.517 回答
0

尝试这个:

/^\d*[0-9](|.\d*[0-9]|;\d*[0-9])*$/;

它符合您的要求。

于 2013-08-31T04:18:33.757 回答