Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
Regex 两个特殊字符之间字符串的Powershell正则表达式_Regex_Powershell - Fatal编程技术网

Regex 两个特殊字符之间字符串的Powershell正则表达式

Regex 两个特殊字符之间字符串的Powershell正则表达式,regex,powershell,Regex,Powershell,文件名如下所示 $inpFiledev = "abc_XYZ.bak" 我只需要变量中的XYZ就可以与其他文件名进行比较。 我尝试了以下方法: [String]$findev = [regex]::match($inpFiledev ,'_*.').Value Write-Host $findev 正则表达式中的星号与文件系统列表命令中的星号的行为不同。目前,您的正则表达式正在查找下划线,重复零次或多次,后跟正则表达式中表示的任何字符加句点。因此正则表达式在字符串的开头找到零下划线,然后找到

文件名如下所示

$inpFiledev = "abc_XYZ.bak"
我只需要变量中的XYZ就可以与其他文件名进行比较。 我尝试了以下方法:

[String]$findev = [regex]::match($inpFiledev ,'_*.').Value
Write-Host $findev

正则表达式中的星号与文件系统列表命令中的星号的行为不同。目前,您的正则表达式正在查找下划线,重复零次或多次,后跟正则表达式中表示的任何字符加句点。因此正则表达式在字符串的开头找到零下划线,然后找到“a”,这就是它返回的匹配项

首先,纠正这一点:

'_*.'
变为下划线,后跟任意数量的字符,后跟文字句点。“文字句点”意味着我们需要使用\来转义正则表达式中的句点,记住句点表示任何字符:

'_.*\.'
_强调 *任意数量的字符 \.文字句号 这将返回:

_XYZ

所以,不远了

如果您希望从角色之间返回某些内容,则需要使用捕获组。在要保留的位周围加括号:

'_(.*)\.'
然后,您需要使用PowerShell正则表达式组来获取值:

[regex]::match($inpFiledev ,'_(.*)\.').Groups[1].Value
返回:XYZ


组[1]中的数字1仅表示第一个捕获组,您可以通过使用更多括号向表达式中添加任意数量的内容,但在这种情况下,您只需要一个括号。

正则表达式中的星号与文件系统列表命令中的星号的行为方式不同。目前,您的正则表达式正在查找下划线,重复零次或多次,后跟正则表达式中表示的任何字符加句点。因此正则表达式在字符串的开头找到零下划线,然后找到“a”,这就是它返回的匹配项

首先,纠正这一点:

'_*.'
变为下划线,后跟任意数量的字符,后跟文字句点。“文字句点”意味着我们需要使用\来转义正则表达式中的句点,记住句点表示任何字符:

'_.*\.'
_强调 *任意数量的字符 \.文字句号 这将返回:

_XYZ

所以,不远了

如果您希望从角色之间返回某些内容,则需要使用捕获组。在要保留的位周围加括号:

'_(.*)\.'
然后,您需要使用PowerShell正则表达式组来获取值:

[regex]::match($inpFiledev ,'_(.*)\.').Groups[1].Value
返回:XYZ

组[1]中的数字1仅表示第一个捕获组,您可以通过使用更多的括号向表达式中添加任意数量的内容,但在这种情况下,您只需要一个括号。

因为您使用的是[regex]加速器,所以需要反斜杠来结束。如果您想匹配它,并且在asterix前面需要一个点来匹配下划线后面的任何字符。如果中间的字符都是字母,则使用\w+

因为您使用的是[regex]加速器,所以需要使用反斜杠来避开端点。如果您想匹配它,并且在asterix前面需要一个点来匹配下划线后面的任何字符。如果中间的字符都是字母,则使用\w+


这演示了另外两种从示例字符串中获取所需信息的方法。第一种方法对原始字符串使用basic.Split string方法。第二种假设您正在处理文件对象,并从获取文件的.BaseName开始。这已经删除了扩展,因此您无需自己动手

如果您处理的是大量字符串,而不是文件对象,那么前面的正则表达式回答可能会更快。[咧嘴笑]

输出

split on a string         = XYZ
split on BaseName of file = XYZ

这演示了另外两种从示例字符串中获取所需信息的方法。第一种方法对原始字符串使用basic.Split string方法。第二种假设您正在处理文件对象,并从获取文件的.BaseName开始。这已经删除了扩展,因此您无需自己动手

如果您处理的是大量字符串,而不是文件对象,那么前面的正则表达式回答可能会更快。[咧嘴笑]

输出

split on a string         = XYZ
split on BaseName of file = XYZ
要使用两种PowerShell惯用替代方案来补充:

有关如何在PowerShell中使用正则表达式的概述,请参阅

使用-split按u和进行拆分,提取生成的3元素数组的中间元素:

PS> ("abc_XYZ.bak" -split '[_.]')[1]
XYZ
-split的第一个RHS操作数是正则表达式;正则表达式[551;]是一个字符集[…],与单个字符匹配。这不是字面意思,就是字面意思。因此,输入abc_XYZ.bak被分解为一个包含字符串abc、XYZ和bak的数组。因此,应用索引[1]提取中间标记XYZ。 使用-replace通过捕获组…(在替换操作数中称为$1)提取感兴趣的令牌:

-replace too在正则表达式上作为第一个RHS操作数(替换内容)进行操作,而第二个操作数指定替换匹配的子字符串的内容

正则表达式^.+[^.]+.+$:

^.+\匹配一个或多个+字符。在t的开始 他输入^-注意如何输入在字符集[…]之外使用-是表示单行输入字符串中任何字符的正则表达式元字符

[^.]+是一个捕获组。。。匹配否定字符集[^…]:[^.]匹配任何文字字符。这不是文字,一次或多次+

无论什么匹配了里面的子表达式。。。可以在替换操作数中引用为$,其中表示正则表达式中捕获组的基于1的索引;在本例中,$1可用于引用第一个也是唯一一个捕获组

.+$匹配一个或多个+剩余字符。直到输入的末尾达到$

替换操作数$1只是指第一个捕获组匹配的对象;在本例中:XYZ

有关-replace替换操作数语法的全面概述,请参阅。 要使用两种PowerShell惯用替代方案来补充:

有关如何在PowerShell中使用正则表达式的概述,请参阅

使用-split按u和进行拆分,提取生成的3元素数组的中间元素:

PS> ("abc_XYZ.bak" -split '[_.]')[1]
XYZ
-split的第一个RHS操作数是正则表达式;正则表达式[551;]是一个字符集[…],与单个字符匹配。这不是字面意思,就是字面意思。因此,输入abc_XYZ.bak被分解为一个包含字符串abc、XYZ和bak的数组。因此,应用索引[1]提取中间标记XYZ。 使用-replace通过捕获组…(在替换操作数中称为$1)提取感兴趣的令牌:

-replace too在正则表达式上作为第一个RHS操作数(替换内容)进行操作,而第二个操作数指定替换匹配的子字符串的内容

正则表达式^.+[^.]+.+$:

^.+\匹配一个或多个+字符。在输入的开始处^-注意如何操作。-在字符集[…]之外使用-是表示单行输入字符串中任何字符的正则表达式元字符

[^.]+是一个捕获组。。。匹配否定字符集[^…]:[^.]匹配任何文字字符。这不是文字,一次或多次+

无论什么匹配了里面的子表达式。。。可以在替换操作数中引用为$,其中表示正则表达式中捕获组的基于1的索引;在本例中,$1可用于引用第一个也是唯一一个捕获组

.+$匹配一个或多个+剩余字符。直到输入的末尾达到$

替换操作数$1只是指第一个捕获组匹配的对象;在本例中:XYZ

有关-replace替换操作数语法的全面概述,请参阅。
显然我打字很慢。如果你想实际捕获特殊字符之间的字符串,这会更好。显然我打字很慢。如果您想实际捕获特殊字符之间的字符串,这会更好。