regex 正则表达式捕获可变数量的项?

w6lpcovy  于 2022-12-01  发布在  其他
关注(0)|答案(3)|浏览(135)

我正在尝试使用正则表达式来捕获空格分隔项中的值。是的,我知道我可以使用[string]::Split()-split。目标是使用正则表达式,以便将其放入另一个更大的正则表达式的正则表达式中。
字符串中的项数是可变的。在本例中有四(4)个。生成的$Matches变量包含所有Value成员的完整字符串。我还尝试了regex '^((.*)\s*)+',但结果是除第一个.\value.txt外,所有成员都为“”
我怎样写一个正则表达式来捕获可变数量的项。

PS C:\src\t> $s = 'now is the time'
PS C:\src\t> $m = [regex]::Matches($s, '^((.*)\s*)')
PS C:\src\t> $m

Groups    : {0, 1, 2}
Success   : True
Name      : 0
Captures  : {0}
Index     : 0
Length    : 15
Value     : now is the time
ValueSpan :

PS C:\src\t> $m.Groups.Value
now is the time
now is the time
now is the time
PS C:\src\t> $PSVersionTable.PSVersion.ToString()
7.2.2
sg24os4d

sg24os4d1#

您可以使用[regex]::Match()查找 first 匹配子字符串,然后调用NextMatch()遍历输入字符串,直到找不到进一步的匹配。
我冒昧地将表达式简化为\S+(连续的非空格字符):

$string = 'now is the time'
$regex = [regex]'\S+'

$match = $regex.Match($string)
while($match.Success){
  Write-Host "Match at index [$($match.Index)]: '$($match.Value)'"

  # advance to the next match, if any
  $match = $match.NextMatch()
}

将打印:

Match at index [0]: 'now'
Match at index [4]: 'is'
Match at index [7]: 'the'
Match at index [11]: 'time'
yftpprvb

yftpprvb2#

Mathias' answer示出了检索可能需要或不需要的所有匹配的 * 迭代 * 方法。
在您自己尝试使用[regex]::Matches()的基础上,解决方案非常简单:

$s = 'now is the time'
[regex]::Matches($s, '\S+').Value # -> @('now', 'is', 'the', 'time')

如上所述,\S+匹配 * 非 * 空白字符(\S)的任何非空运行(+)。
由于member-access enumeration,访问方法调用结果(System.Text.RegularExpressions.Match示例的集合)上的.Value属性,将返回每个示例的.Value属性,如果有两个或更多示例,则会生成一个值的 * 数组 *。

0x6upsns

0x6upsns3#

我猜以下内容对您有用

[^\s]+

[^\s]表示“不是空格”
+表示1个或多个字符

相关问题