在regex组中无法匹配括号

时间:2017-01-13 12:37:12

标签: c# .net regex

这是一个正则表达式,在.NET中进行评估

我有以下输入:

get-host

我想生成两个匹配的组,${guid->newguid()} 之后和${之前的字符序列,由}分割:

  • GUID
  • newguid()

我使用的模式如下:

->

但是这与括号不符,我只得到以下匹配:

  • GUID
  • newguid

如何修改正则表达式以便获得所需的组?

2 个答案:

答案 0 :(得分:1)

你的正则表达式 - ([^(?<=\${)(.*?)(?=})->]+) - 匹配除了否定字符类中定义的字符之外的1 +个字符(即除(之外的一个或多个字符,?,{{1等等)。

我建议使用匹配的正则表达式:

<

请参阅regex demo

您需要的结果位于\${([^}]*?)->([^}]*)} match.Groups[1]

模式详情

  • match.Groups[2] - 匹配\${文字字符序列
  • ${ - 第1组尽可能少地捕获除([^}]*?)以外的0个字符
  • } - 文字字符序列->
  • -> - 第2组尽可能多地捕获除([^}]*)以外的0 +字符
  • } - 文字}

如果您知道内部只有 word 字符,则可以将正则表达式简化为

}

请参阅regex demo。但是,它不那么通用了。

答案 1 :(得分:1)

您的输入结构始终为${identifier->identifier()}?如果是这种情况,您可以使用^\$\{([^-]+)->([^}]+)\}$

否则,您可以将 regexpr 修改为([^?<=\${.*??=}\->]+):使用此 rexexpr ,您应该匹配输入并获取所需的组:uidnewguid()密钥更改- char的引用,它在没有引用的情况下作为 range 运算符,并强制您在模式中插入括号 - 但是...... [^......(....)....]从比赛中排除括号。

我希望能帮到你!

编辑:使用https://regex101.com进行测试对我有很大帮助......告诉我-范围运算符。