用正则表达式提取字符串检索'True 111499'

时间:2018-06-18 10:17:38

标签: regex powershell

我有一个函数,它应该检索文本文件中的修订号。文本文件如下所示:

componentname1:123456
componentname2:234567

第二部分是一个数字,表示颠覆修订号。 powershell脚本逐行读取此文件,然后使用此函数处理每一行:

function getRevision($line) {
    $line -match ":(?<revision>[0-9]*)"
    $result = $Matches['revision']
    Write-Host "Found component revision '$($result)'"
    return $result
}

处理函数getRevision时,它会给出输出

Found component revision '111499'

此函数由另一个函数调用:

$rev = getRevision($Line)
# ....
someOtherFunction -Revision "$($rev)"

在这个someOtherFunction中,我现在得到这个输出:

Handle component with revision 'True 111499'

修改 我添加了函数someOtherFunction的基本代码:

function someOtherFunction {

    param(
        [Parameter(Mandatory=$True)]
        [String]$Revision
    )

    Write-Host "Handle component with revision '$($Revision)'"
}

现在,问题出现了:为什么会有这个True的东西?我的错误在哪里?

2 个答案:

答案 0 :(得分:2)

如果这是您的源数据的形成方式,即冒号分隔的键值对。我认为ConvertFrom-StringData会删除所有&#34;复杂性&#34;从这个问题。但它需要&#34; key = value&#34;所以我们需要进行一些小改动,最后,你将整个文件作为哈希表。

如果该样本数据位于名为c:\ temp \ file.txt

的文件中
$revisions = (Get-Content -Raw C:\temp\file.txt) -replace ":","=" | ConvertFrom-StringData
$revisions['componentname1']

如果存在数据错误的风险,您可以通过仅处理具有冒号的行来执行一些基本过滤:

$data = (Get-Content  C:\temp\file.txt | Where-Object{$_ -match ":"}) -replace ":","=" | Out-String | ConvertFrom-StringData
$data['componentname1']

答案 1 :(得分:1)

关键字True来自函数第一行的-match运算符

$line -match ":(?<revision>[0-9]*)"

如果在函数内部执行-match,则会将其输出(二进制值)自动添加到函数的输出中,然后将$result添加为第二个元素。因此,如果您检查$rev的值,您会看到:

PowerShell> $rev
True
123456

如果您想摆脱第一个元素,只需将其传递给Out-Null

$line -match ":(?<revision>[0-9]*)" | Out-Null

编辑:正如Matt所指出的,如果$line与模式不匹配,则可能会返回意外结果(上次成功匹配)。为了防止这种情况,你可以使用:

if ($line -match ":(?<revision>[0-9]*)") {
    $result = $Matches['revision'] 
    Write-Host "Found component revision '$($result)'"
    return $result}
else {return $false}

在这种情况下,Out-Null不需要-matchifyou can do it by define method @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); if(action == MotionEvent.ACTION_DOWN){ // ... }else if(action == MotionEvent.ACTION_UP){ // ... startAnimation(); return true; }else if(action == MotionEvent.ACTION_MOVE){ // ... } return false; } public void run(){ int start = (int)mMainData.getY(); int end = (int)mTargetData.getY(); mScroller.startScroll(0, start, 0, -Math.round(mMainData.getY() - end), 500); while(canAnimate()){ while(mScroller.computeScrollOffset()){ mMainData.setY(mScroller.getCurrY()); postInvalidate(); } stopAnimation(); } } private void startAnimation(){ mThread = new Thread(this); mThread.start(); } private void stopAnimation(){ animate = false; } private boolean canAnimate(){ return animate == true; } 条件未添加到输出中。