0

我正在尝试匹配格式为 [integer][colon][alphanum][colon][integer] 的字符串。例如,42100:ZBA01:20。我需要用冒号分隔这些......

我想学习正则表达式,所以如果可以的话,告诉我我做错了什么:这就是我能够想出的......

^(\d):([A-Za-z0-9_]):(\d)+$
^(\d+)$ 
^[a-zA-Z0-9_](:)+$
^(:)(\d+)$

起初我尝试匹配字符串的一部分,这些匹配整个字符串。如您所知,我对正则表达式不是很熟悉。

编辑:正则表达式用于输入桌面应用程序。我不确定要使用什么“语言”或“类型”的正则表达式,所以我假设 .NET 。我需要能够识别每个分组字符,用冒号分隔。所以第 1 组应该是第一个整数,第 2 组应该是字母数字组,第 3 组应该是整数(范围 1-4)。

先感谢您,

大流士

4

2 回答 2

7

我假设分号 ( ;) 是冒号 ( :)?好吧,有点基础。

  • ^匹配输入的开头。也就是说,正则表达式只有在输入的开头找到匹配项时才会匹配。
  • 同样,$匹配输入的结尾。

^(\d+)$将匹配一个或多个数字组成的字符串。这是因为匹配需要在输入的开头开始并在输入的结尾停止。换句话说,整个输入需要匹配(不仅仅是其中的一部分)。+表示一个或多个匹配项。

有了这些知识,您会注意到这^(\d):([A-Za-z0-9_]):(\d)+$实际上非常接近正确。这个表达式表示整个输入需要匹配:

  1. 一位数;
  2. 一个冒号;
  3. 一个单词字符(或您所说的字母数字字符);
  4. 一个冒号;
  5. 一位或多位数字。

问题显然出在 1 和 3 中。您需要在+此处添加一个量词以匹配一次或多次,而不仅仅是一次。此外,您希望将这些量词放在捕获组内,以便在一个捕获组内获得多个匹配项,而不是接收包含单个匹配项的多个捕获组。

^(\d+):([A-Za-z0-9_]+):(\d+)$
于 2013-02-08T15:27:26.053 回答
3

你需要使用量词

^(\d+):([A-Za-z0-9_]+):(\d+)$
    ^     ^     ^

+是与前面的模式 1 多次匹配的量词

现在您可以通过访问特定组来访问这些值

于 2013-02-08T15:22:01.937 回答