Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正则表达式-匹配多个后缀(更长或更短)_Sql_Regex_Powershell - Fatal编程技术网

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

Sql 正则表达式-匹配多个后缀(更长或更短),sql,regex,powershell,Sql,Regex,Powershell,由于无法获得所需的Servername、instance name和port(如果可用)输出,因此我目前无法解决powershell regex的一个问题。诚然,我有很多要了解的,因为我是新加入regex的 这是我目前的设置和发现 Data: ZP000042 QRMLD1001\TEST oFJA UUQE0294\FAR,8594 基本上,我需要提取以下项目: Match 1[QRMLD1001\TEST] - Servername: QRMLD1001 ; Instan

由于无法获得所需的Servername、instance name和port(如果可用)输出,因此我目前无法解决powershell regex的一个问题。诚然,我有很多要了解的,因为我是新加入regex的

这是我目前的设置和发现

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
到目前为止,我只能通过这个正则表达式提取
匹配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个组,这意味着无论指定端口与否,我都希望解析服务器和实例名称,如果包含端口,那么端口也是。

您可以在
和最后一个数字之后放置一个允许0发生的量词,如下所示

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

您可以在
和最后一个数字后面放置一个允许0发生的量词,如下所示

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

我认为一个简单的方法是使模式的整个后部分成为可选的

(\w+)\\(\w+)(,(\d+))?
所以这两个都匹配

UUQE0294\FAR,8594
UUQE0294\FAR
您可以使用一些lookbehind使其更健壮一些,但这里没有多少好处。只需注意,您的比赛组将需要调整,因为还有一个。通过使用命名匹配,您还可以使该部分变得更简单

(?<server>\w+)\\(?<instance>\w+)(,(?<port>\d+))?

如果端口没有匹配项,那么,
$matches.port
将只是空值。

我的简单方法是将整个模式的后半部分设置为可选

(\w+)\\(\w+)(,(\d+))?
所以这两个都匹配

UUQE0294\FAR,8594
UUQE0294\FAR
您可以使用一些lookbehind使其更健壮一些,但这里没有多少好处。只需注意,您的比赛组将需要调整,因为还有一个。通过使用命名匹配,您还可以使该部分变得更简单

(?<server>\w+)\\(?<instance>\w+)(,(?<port>\d+))?

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

哇!谢谢你,兰斯·托斯。那个真是少了什么啊!快速跟进,是否可以在未指定端口时消除空白/空组4?e、 g.[QRMLD1001\TEST]仍然给出4组,最后一组设置为空。@carlardinte我不知道任何方法,sorryWow!谢谢你,兰斯·托斯。那个真是少了什么啊!快速跟进,是否可以在未指定端口时消除空白/空组4?e、 g.[QRMLD1001\TEST]仍然给出4组,最后一组设置为空。@Carlardinte我不知道任何方法,抱歉,非常感谢你!命名组和lookback对我来说是新事物,所以感谢您指出这一点!我对你的正则表达式做了一点小小的修改,改为
(?\w+)\\(?\w+)\,(?\d+)
,因为你原来发布的一个正则表达式实际上给了我另一个带有逗号的组[例如,8594]@carlardente,但我认为逗号是可选的?另外,第一个选项有一个没有逗号的组,因此您只需跳过它。看看比赛结果,你会看到的。非常感谢你!命名组和lookback对我来说是新事物,所以感谢您指出这一点!我对你的正则表达式做了一点小小的修改,改为
(?\w+)\\(?\w+)\,(?\d+)
,因为你原来发布的一个正则表达式实际上给了我另一个带有逗号的组[例如,8594]@carlardente,但我认为逗号是可选的?另外,第一个选项有一个没有逗号的组,因此您只需跳过它。看看什么匹配返回,你会看到。