我有
形式的字符串Formula1(value) + Formula2(anotherValue) * 0.5
其中Formula1
和Formula2
是常数。我想使用 regex
将初始字符串转换为
Formula1(value, constantWord) + Formula2(anotherValue, constantWord) * 0.5
此处value
,anotherValue
等是大写字母和数字的字符串,可以由2
或{ {1}}个字符。
3
的正则表达式非常简单。但是剩下的部分对我来说更困难。
如何在 C#或 Java 中做到这一点?
示例:
value
所需结果:
Swipe(YN1) + Avg(DNA) * 0.5
答案 0 :(得分:1)
您可以尝试向前看和向后看
(?<=[A-Za-z][A-Za-z0-9]*\s*\(\s*)[A-Z0-9]{2,3}(?=\s*\))
正则表达式详细信息:
我们有一个感兴趣的简单{em>匹配 [A-Z0-9]{2,3}
-从2
到3
大写字母或数字。但是此 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