【问题标题】:How can I use regex to chop apart xcopy statements embedded in .csproj files?如何使用正则表达式分割嵌入 .csproj 文件中的 xcopy 语句?
【发布时间】:2011-05-13 14:59:36
【问题描述】:

我正在处理一堆 (~2000) .csproj 文件,在这个开发人员中,有一个历史先例是在构建后事件中嵌入 xcopy 以在构建过程中移动东西。为了将构建知识集中到一个地方,我正在努力消除这些 xcopy 调用,转而在我们的自动化构建过程中使用声明式构建操作。

考虑到这一点,我正在尝试提出一个正则表达式,我可以使用它来删除提供给 xcopy 的路径参数。这些陈述有几种风格:

xcopy /F /I /R /E /Y "..\..\..\Microsoft\Enterprise Library\3.1\bin"
xcopy /F /I /R /E /Y ..\Crm\*.* .\
xcopy ..\NUnit ..\..\..\output\debug /I /Y

具体来说:

  • 不可预测的开关位置
  • 不总是提供目标路径参数
  • 路径参数有时用引号括起来

我不是正则表达式向导,但这就是我到目前为止所得到的(过度使用 parenteses 是为了在 powershell 中保存匹配:

(.*x?copy.* '"?)([^ /'"]+)('"/.* '"?)([^ /'"]+)('"?.*)

([^ /'"]+) 部分是我打算作为路径参数的部分,被定义为不包含引号、空格或正斜杠的字符串,但我觉得我必须应用两个正则表达式(一个用于带空格的引号包裹的路径和一个不带引号的路径)

不幸的是,当我运行这个正则表达式时,它似乎为我提供了第一个和第二个路径参数的相同匹配。最令人沮丧。

我该如何改变它来纠正它?

【问题讨论】:

  • 你想精确匹配什么?仅路径,或者您希望将每个 xcopy 语句拆分为三个单独的匹配项(xcopy、参数、路径)?
  • 我主要关心更新路径参数,因为当事物移动时必须维护它们(它们都表示为相对路径)。

标签: regex powershell build-automation csproj xcopy


【解决方案1】:

在这种情况下,我喜欢利用 PowerShell 的参数解析系统。使用一个简单的正则表达式来获取整个 xcopy 行,然后通过函数运行它。

$samples = 'xcopy /F /I /R /E /Y "..\..\..\Microsoft\Enterprise Library\3.1\bin"',
    'xcopy /F /I /R /E /Y ..\Crm\*.* .\',
    'xcopy ..\NUnit ..\..\..\output\debug /I /Y'

function argumentgrinder {
    $args | Where-Object {($_ -notlike "/*") -and ($_ -ne "xcopy")}
}

$samples | foreach { Invoke-Expression "argumentgrinder $_"}

您必须小心路径中任何看起来像 PowerShell 变量的内容($@ 和括号)。

【讨论】:

  • 我有点喜欢这个。因此,当您将字符串传递给 argumentsgrinder 时,它会被切碎到 args 数组中以便于使用,从而让我不必担心引号和空格以及排序......确实非常好。
【解决方案2】:

我认为您不需要两种不同的模式来匹配路径。

以下模式应与您提供的所有三种情况下的每条语句匹配:

\A(xcopy)\s+([\/A-Z\s]*)\s*((".*?")|([^\s]*))\s*((".*?")| ([^\s]*))\s*([\/A-Z\s]*)

我使用 (|) 来匹配各种组合中的路径。

注意因为我目前还没有 windows,所以我一直在我的 linux ruby 上测试这种模式,但语法不应该不同,或者至少应该给你一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多