如何使用正则表达式分解 .csproj 文件中嵌入的 xcopy 语句?

发布于 2024-11-07 13:34:01 字数 785 浏览 0 评论 0原文

我正在处理一堆 (~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

具体来说:

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

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

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

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

不幸的是,当我运行此正则表达式时,它似乎给了我相同的匹配 个路径参数都是最令人沮丧的。

第一个和第二

I'm working with a bunch (~2000) .csproj files, and in this development staff there's a historical precedent for embedded xcopy in the post-build events to move things around during the build process. In order to get build knowledge into once place, I'm working towards eradicating these xcopy calls in favor of declarative build actions in our automated build process.

With that in mind, I'm trying to come up with a regex I can use to chop out the path arguments supplied to xcopy. The statements come in a couple flavors:

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

specifically:

  • unpredictable placement of switches
  • destination path argument not always supplied
  • path arguments sometimes wrapped in quotes

I'm no regex wizard, but this is what I've got so far (the excessive use of parenteses are for match saving in powershell:

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

the ([^ /'"]+) sections are the part that I intend to be the path arguments, being defined as strings containing no quotes, spaces, or forwards slashes, but I have a feeling I'll have to apply two regexes (one for quote-wrapped paths with spaces and one for no-quote paths)

Unfortunately, when I run this regex it seems to give me the same match for both the first and second path arguments. Most frustrating.

How would I change this to correct it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡莣 2024-11-14 13:34:01

在这种情况下,我喜欢利用 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 变量的内容($@ 和括号)。

In cases like this, I like to leverage PowerShell's argument parsing system. Use a simple regex to grab the whole xcopy line and then run it through a function.

$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 $_"}

You do have to be careful of anything that looks like a PowerShell variable in the paths though ($, @ and parentheses).

风追烟花雨 2024-11-14 13:34:01

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

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

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

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

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

I don't think you need two different patterns to match the paths.

The following pattern should match each single statement in all three cases you have provided:

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

I've used or (|) to match paths in the various combinations.

NOTE Because I've not windows at the moment, I've been testing this pattern on my linux ruby but the syntax should not be different or at least should give you an idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文