【问题标题】:RegEx getting script & parameters .. almost there正则表达式获取脚本和参数 .. 几乎就在那里
【发布时间】:2009-12-18 17:25:50
【问题描述】:

我正在尝试解析 Powershell 脚本的函数和参数。我快到了,但我在换行时遇到了麻烦。该表达式将 test2 解析为 test6 很好,但使用 test1 我无法让它工作。

我当然可以指定我的客户不使用第一种语法,但必须有办法。有人可以指出我正确的方向吗? FWIW:我在 C# 中使用它。

我使用的正则表达式是:“function (\w*)\s*\{\s*param\((.*)\)\s*}

内容testfile.ps1:

function test1    {
  param([string]$parm1, [int]$parm2,
    [bool]$parm3)}


function test2
{
    param([int]$parm2, [bool]$parm3)

}

function test3
{    param(blabla3)}

function test4 { param(blabla4) }
function test5 {param(blabla5)}
function test6{param(blabla6)}

谢谢, 亚历克斯

【问题讨论】:

    标签: c# regex newline


    【解决方案1】:

    因为你没有向你展示代码我猜你没有告诉Regex 对象允许换行。您可以使用 RegexOptions.Singleline 选项执行此操作。这会改变 .表达式以允许它与换行符 (\n) 匹配。但是,如果你这样做,你的表达可能会比你想要的更多。正则表达式是贪婪的,这个(.*) 将消耗文件中的最后一个括号。您可能想尝试以下方法:

    function (\w*)\s*\{\s*param\(([^)]*)\)\s*}
    

    【讨论】:

    • 这看起来不错,但请注意,它不允许在 functionparam 之后使用额外的空格:^\s*function\s*(\w*)\s*\{\s*param\s*\(([^)]*)\) 我也避免捕获函数的其余部分,因为它没有看起来你不需要它。
    • 这确实有效!谢谢!我曾尝试过该选项,但 (.*) 可能把事情搞砸了。现在唯一的事情是似乎创建了 3 个组而不是 2 个。第一个组总是有一个空间。我可以消除带有尾随\s* 的那些,但我仍然不明白为什么会发生这种情况。 @ciaran-walsh:^$ 不起作用。也许是因为它现在是单线?
    【解决方案2】:

    你的正则表达式是单行还是多行匹配模式?

    我认为:

    "^function (\w*)\s*\{\s*param\((.*)\)\s*}$"
    

    可能在多行模式下工作。我现在没有打开Expresso 来测试它。

    【讨论】:

    • 多行模式。但是如上所述,行首和行尾选项无法正常工作。
    【解决方案3】:
    function (\w*).*?\{.*?[A-Za-z]+\((.*?)\).*?}
    

    在“.”上启用多行匹配如前所述并使用它。我针对http://www.myregextester.com/ 进行了测试,它似乎有效。

    我已将您的 \s* 替换为 .*?。这匹配任何字符,非贪婪,直到下一个指定的序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多