问题描述
我已经搜索了所有关于此的其他主题,但我的解析格式有一个独特的方面,我无法克服。我正在尝试使用标准格式解析电子邮件地址,如下所示 - firstname.lastname.#####@email.com ie 'john.smith.12345@email.com'>
我想返回数字序列之前的任何字母字符 - 'john smith'(或者 .12345 之前的所有名字,以防人们有多个名字)。
现在,我已经计算出 (^[A-Za-z]+\.+[A-Za-z]+)
的正则表达式,但是返回 'john.smith' 这不是世界末日,因为我可以拆分它。
任何帮助将不胜感激。
解决方法
点击下面的代码块试试看。
如果您在数字前只有两个或三个点分隔的名称,您可以对组替代项进行硬编码:
(?:([A-Za-z]+)\.([A-Za-z]+)|([A-Za-z]+)\.([A-Za-z]+)\.([A-Za-z]+))\.\d+@[^\s@]+
这里我们使用非捕获组来包含备选方案。
对于一个、两个或三个点分隔的名称,模式是相似的(虽然有点混乱)。
另一种方法是用可选的非捕获组包装前面的一些点 + 捕获组部分。
([A-Za-z]+)\.([A-Za-z]+)(?:\.([A-Za-z]+))?\.\d+@[^\s@]+
这样可以更简洁地表达 1-3 个点分隔的名称:
([A-Za-z]+)(?:\.([A-Za-z]+))?(?:\.([A-Za-z]+))?\.\d+@[^\s@]+