在模式中提取动态值,然后将其放入另一个模式

时间:2018-09-24 10:42:48

标签: java c# regex

我有

形式的字符串
Formula1(value) + Formula2(anotherValue) * 0.5

其中Formula1Formula2常数。我想使用 regex 将初始字符串转换为

Formula1(value, constantWord) + Formula2(anotherValue, constantWord) * 0.5

此处valueanotherValue等是大写字母数字的字符串,可以由2或{ {1}}个字符。

3的正则表达式非常简单。但是剩下的部分对我来说更困难。

如何在 C# Java 中做到这一点?

示例:

value

所需结果:

Swipe(YN1) + Avg(DNA) * 0.5

1 个答案:

答案 0 :(得分:1)

您可以尝试向前看向后看

(?<=[A-Za-z][A-Za-z0-9]*\s*\(\s*)[A-Z0-9]{2,3}(?=\s*\))

正则表达式详细信息:

我们有一个感兴趣的简单{em>匹配 [A-Z0-9]{2,3}-从23 大写字母数字。但是此 match 应该在 公式之后(例如Swipe(Formula1()和之前 ) 。假设公式标识符(从字母开始,可以包含字母或数字),我们可以放入

(?<=  )      - group, behind: should appear before the match; will not be included into it
[A-Za-z]     - one letter (Formula1)
[A-Za-z0-9]* - letters or digits, zero or more
\s*          - whitespaces (spaces, tabultalions) - zero or more

匹配

[A-Z0-9]{2,3} - Capital letters or digits from 2 to 3 characters 

最后,我们应该在oreder中提前 来找出右括号:

(?= ) - group, ahead: should appear before the match; will not be included into it
\s*   - zero or more whitespaces (spaces, tabulations etc)      
\)   - closing parenthesis (escaped)

结合起来,我们有

(?<=[A-Za-z][A-Za-z0-9]*\s*\(\s*) -- Behind:
                                  --   Letter, zero or more letters or digits, parenthesis 

[A-Z0-9]{2,3}                     -- Value to match (2..3 capital letters or digits)

(?=\s*\)                          -- Ahead: 
                                  --   Closing parenthesis 

最终模式

(?<=[A-Za-z][A-Za-z0-9]*\s*\(\s*)[A-Z0-9]{2,3}(?=\s*\))

有关详情,请参见https://www.regular-expressions.info/lookaround.html

C#代码:

string source = @"Swipe(YN1) + Avg(DNA) * 0.5";
string argument = "calculate";  

string result = Regex.Replace(
    source, 
  @"(?<=[A-Za-z][A-Za-z0-9]*\s*\(\s*)[A-Z0-9]{2,3}(?=\s*\))", 
    match => match.Value + $", {argument}");

Console.Write(result);

结果:

Swipe(YN1, calculate) + Avg(DNA, calculate) * 0.5