正则表达式 - 匹配多个后缀(更长或更短)

时间:2018-03-14 10:32:31

标签: sql regex powershell

我目前遇到了PowerShell正则表达式的问题,因为我无法获得所需的Servername,实例名称和端口输出(如果可用)。不可否认,因为我是正则表达式的新手,所以我有很多需要了解。

这是我的设置和我迄今为止的调查结果

Data:

  ZP000042
  QRMLD1001\TEST
  oFJA
  UUQE0294\FAR,8594

基本上我需要提取以下内容:

Match 1[QRMLD1001\TEST] - Servername: QRMLD1001 ; Instancename: TEST

Match 2[UUQE0294\FAR,8594] - Servername: UUQE0294 ; Instancename: FAR ; Port: 8594

到目前为止,我只能通过此正则表达式提取Match 2[ UUQE0294\FAR,859]

(\w+)\\(\w+)\,(\d+)

结果:

Groups   : {0, 1, 2, 3}
Success  : True
Name     : 0
Captures : {0}
Index    : 0
Length   : 16
Value    : UUQE0294\FAR,859

Success  : True
Name     : 1
Captures : {1}
Index    : 0
Length   : 8
Value    : UUQE0294

Success  : True
Name     : 2
Captures : {2}
Index    : 9
Length   : 3
Value    : FAR

Success  : True
Name     : 3
Captures : {3}
Index    : 13
Length   : 3
Value    : 859

我真的只想拥有3到4个组,这意味着无论是否指定了端口,我都希望剖析服务器和实例名称,如果包含端口,那么端口也是如此

2 个答案:

答案 0 :(得分:1)

你可以放一个允许在,和最后一个数字之后出现0的量词,就像这样

(\w+)\\(\w+)\,?(\d*)

答案 1 :(得分:1)

我简单的方法是使模式的后一部分可选。

(\w+)\\(\w+)(,(\d+))?

这样就可以匹配这两个

UUQE0294\FAR,8594
UUQE0294\FAR

你可以通过一些外观来使这一点更加强大,但这里没有太大的收获。请注意,您的匹配组需要进行调整,因为还有一个匹配组。通过使用命名匹配

,您可以使该部分更容易一些
(?<server>\w+)\\(?<instance>\w+)(,(?<port>\d+))?

所以现在你可以这样做,而不必担心组索引。

$matches.server
$matches.instance
$matches.port

如果端口不匹配,则$matches.port将为空。