【问题标题】:Regex to match [integer][colon][alphanum][colon][integer]正则表达式匹配 [integer][colon][alphanum][colon][integer]
【发布时间】:2013-01-24 09:39:10
【问题描述】:

我正在尝试匹配格式为 [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)。

提前谢谢你,

大流士

【问题讨论】:

  • 抱歉分号,这是我所做的更改。帖子已更新。
  • 你需要指定你正在使用的语言。正则表达式的实现因语言而异

标签: regex


【解决方案1】:

我假设分号 (;) 是冒号 (:)?好的,基本的一点。

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

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

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

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

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

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

【讨论】:

  • 技术上,没有。但是 OP 并没有明确说明他在寻找什么。
  • @nhahtdh 在大多数变体中,它被称为 单词字符。为了清楚起见,更新了我的答案。
  • 我需要能够识别每个分组字符,用冒号分隔。所以第 1 组应该是第一个整数,第 2 组应该是字母数字组,第 3 组应该是整数(范围 1-4)。
  • 所以,Mattias,如果我想匹配 ([integer][colon]),从字面上看,作为一个组,我该怎么做?
  • @MattiasBuelens:“Word”字符和字母数字不同。
【解决方案2】:

你需要使用量词

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

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

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

【讨论】:

  • 在某些语言中,\w 不仅仅包含字母数字(_- 是两个常见的数字)。
  • @JonahBishop 感谢您的建议。编辑 ans..stackoverflow 应该强制使用他们使用的语言标记正则表达式问题...
  • @JonahBishop:- 包含哪些语言?到目前为止我看到的都是字母数字和_
  • 我觉得我在某处看到过连字符,但我可能记错了。我知道如果 reg-ex 正在解析 Unicode 字符,Perl 将使用特定于语言环境的字符(例如,下划线的变体)。请参阅perlrecharclass 了解更多信息。
  • @JonahBishop:我知道激活 Unicode 时的某些变体将开始匹配连接器(.NET 正则表达式)。但是对于 ASCII,我所看到的仅包括字母数字和_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多