Regex条件非捕获组

n7taea2i  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(110)

我试图提取电子邮件的用户名,如果电子邮件是从一个特定的域。否则,获取完整的电子邮件。我需要的结果是在第一组设置。

test@example1.com => test

test@example2.com => test@example2.com**
这是我的正则表达式

^(.*)?(?:@example1\.com)|(?=@example2\.com)$

字符串
我看了这个post,但没有运气。

3yhwsihp

3yhwsihp1#

^(.+?)(?:(?:@example1\.com)?|(?=@))$

字符串
这在捕获组中使用了一个非贪婪量词,因此如果该域在输入中,它将只匹配@example1.com。否则,它使用前瞻来要求输入中有@domain
我们在备选项周围放置一个组,这样它们就不会将整个regexp拆分为单独的备选项。您的regexp只有第一个备选项中的捕获组。
DEMO

mjqavswn

mjqavswn2#

可以匹配正则表达式

(.+(?=@example1\.com$)|.*)

字符串
对于指定的域"example1.com"
Demo
如果不是将结果保存到捕获组1,而是可以简单地使用正则表达式匹配的结果(通常被视为捕获组),则可以使用正则表达式

^.*(?=@example1\.com$)|.*


正则表达式可以分解如下。

(                   # begin capture group 1
  .+                # match one or more characters other than
                    # line terminators, as many as possible
  (?=               # begin a positive lookahead
    @example1\.com  # match "@example1.com"
    $               # match end of string
  )                 # end the positive lookahead
  |                 # or
  .*                # match zero or more characters other than 
                    # line terminators, as many as possible
)                   # end capture group 1

相关问题