用于从字符串中分隔可选尾随数的正则表达式

时间:2018-06-01 13:00:56

标签: regex

我需要将名称与字符串中的数字ID分开,如

  

先生。约翰史密斯1111

最后的ID是可选的。

因此它应该是2个捕获组 - 一个用于名称,另一个用于数字ID。

我想出了以下regular expression:

/^(?P<name>[^\d]+)(?P<id>(?<= )\d+)?$/

问题是:

  1. 如何修剪name组?目前我最终得到了空间。
  2. 如何允许名称包含数字?如果我将[^\d]替换为.*组中的name,则会捕获整个字符串。
  3. 你能想到这个字符串的正则表达式的更好版本吗?

1 个答案:

答案 0 :(得分:4)

您可以使用

^(?P<name>.+?)(?:\s+(?P<id>\d+))?$

请参阅regex demo

<强>详情

  • ^ - start of string
  • (?P<name>.+?) - Group&#34; name&#34;除了换行符之外的一个或多个字符尽可能少,因为*?lazy quantifier(即此模式首先匹配第一个字符,然后跳过,后续的子模式被尝试,只有当它们失败时,这个子模式才会被扩展&#34;)
  • (?:\s+(?P<id>\d+))? - 匹配的可选non-capturing group
    • \s+ - 1+空白字符
    • (?P<id>\d+) - 小组&#34; id&#34;:1+位数
  • $ - end of string