【问题标题】:Regex - Match first and last character within capturing group正则表达式 - 匹配捕获组中的第一个和最后一个字符
【发布时间】:2018-09-21 06:24:41
【问题描述】:

我想捕获捕获组中的第一个和最后一个字符。

我目前的正则表达式是 -

([\w\.]+)@([\w]+)\.com

例如,如果有一个电子邮件地址 -

xyz@test.com

这是输出 -

Full match  0-12    `xyz@test.com`
Group 1.    0-3 `xyz`
Group 2.    4-8 `test`

电子邮件地址可以包含字母数字和句点值。

如果我想缩减第 1 组,使其仅以字母数字值开头和结尾,该怎么做?

我要修改这个捕获组 -

 ([\w\.]+)

所需的输出是 -

xyz.@test.com Invalid
.xyz@test.com Invalid
xy.z@test.com Valid

【问题讨论】:

  • 试试^(\w+(?:\.+\w+)*)@([\w]+)\.com$。在此处查看现场演示regex101.com/r/KyUDuQ/1
  • 另请注意,[\w]+ 可以简化为 \w+ - 那里不需要字符集。
  • @"^\b[\w.]+\b@\w+\.com"$ 也可以。

标签: c# regex


【解决方案1】:

要告诉引擎匹配起始位置和@ 之前的一个英文字母数字字符,您需要这样做:

^([a-zA-Z0-9][\.a-zA-Z0-9]*[a-zA-Z0-9])@([a-zA-Z0-9]+)\.com$

注意:\w 包含您可能不想要的 _

但这不允许用户名只有一个字符。所以你必须稍微修改一下:

^([a-zA-Z0-9]+(?:\.+[a-zA-Z0-9]+)*)@([a-zA-Z0-9]+)\.com$

此外,这不应被视为一个好的电子邮件验证器。但是,由于您似乎缩小了与.com TLD 的匹配范围,所以我认为这是一个非常具体的要求,否则它将域名限制为字母数字,并且不允许根据RFC 822 在电子邮件地址中有效的更多字符.这足以从用户输入中捕获电子邮件地址:

^[^\s@]+@[^\s@]+$

【讨论】:

    【解决方案2】:

    试试这个正则表达式 - (^[\w][\w\.\w]+[\w])@([\w]+)\.com

    【讨论】:

      【解决方案3】:

      这行得通:

      ^([0-9a-zA-Z][a-zA-Z0-9_\.]*)(?<!\.)@([a-zA-Z0-9_]+)\.com$
      

      Demo

      基本上,它会尝试匹配开头的字母数字字符,然后匹配[a-zA-Z0-9_\.] 0 次或更多次。在到达@ 之前,它会向后查看是否有一个点(如果不是字母数字,它必须是一个点)。

      【讨论】:

      • 您可以将后面的内容减少到(?&lt;!\.)。还有\w 在.NET matches unicode 字母中。您也可以不转义该点。
      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多