我使用的是类似的字符串
$upper('anothervalue')$
我编写了一个解析器,可以很好地使用下面的代码解析此语句。
但是,现在另一个系统正在发送一个复杂的字符串,比如(我可以得到任何数量的链式字符串(:
$upper($trim('somevalue')$)$ - $upper('anothervalue')$
如何以特定顺序循环遍历分层数据以评估函数(从最内部的匹配开始(:
$trim('somevalue')$
——我将对此进行评估,比如将其存储在变量x
中
$upper(x)$
——现在用上一条语句的结果来计算上限
$upper('anothervalue')$
private static object EvaluateFunctionsInJson(string jsonValue)
{
object origJsonValue = jsonValue;
var fnMatches = Regex.Matches(jsonValue.ToString(), @"$(.+?)$");
var fnCount = fnMatches.Count;
foreach (var fnMatch in fnMatches)
{
// call another method to evaluate the function
object replaceValue = EvaluateFunction(fnMatch.ToString());
if (fnCount > 1)
{
origJsonValue = origJsonValue.ToString().Replace(fnMatch.ToString(), replaceValue.ToString());
}
else
{
origJsonValue = replaceValue;
}
}
return origJsonValue;
}
private static object EvaluateFunction(string jsonValue)
{
var functionWithoutDollarSign = Regex.Replace(jsonValue.ToString(), @"[$$]+", "");
string functionName = Regex.Match(functionWithoutDollarSign, @"b[A-Za-z]+b", RegexOptions.Singleline).Value; //get the first word
var functionParam = Regex.Match(functionWithoutDollarSign, @"(([^)]*))").Value; //get the text between paranthesis
var functionParamWithoutParanthesis = Regex.Replace(functionParam.ToString(), @"[()]+", "");
var funcParams = functionParamWithoutParanthesis.Split(',');
var value = funcParams[0];
switch (functionName.ToLower().Trim())
{
case "upper":
return value.ToUpper();
case "lower":
return value.ToLower();
case "number":
return Convert.ToInt64(value);
case "boolean":
return Convert.ToBoolean(value);
default:
return value;
}
}
您可以使用
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var text = "$upper($trim('somevalue ')$)$ - $upper('anothervalue')$";
var pattern = @"(?s)$(?<functionName>w+)('?(?<value>[^'\]*(?:\.[^'\]*)*)'?)$";
var prev = string.Empty;
do {
prev = text;
text = Regex.Replace(text, pattern, x => {
switch (x.Groups["functionName"].Value.ToLower().Trim())
{
case "trim":
return x.Groups["value"].Value.Trim();
case "upper":
return x.Groups["value"].Value.ToUpper();
case "lower":
return x.Groups["value"].Value.ToLower();
case "number":
return Convert.ToInt64(x.Groups["value"].Value).ToString();
case "boolean":
return Convert.ToBoolean(x.Groups["value"].Value).ToString();
default:
return x.Groups["value"].Value;
}
});
} while (prev != text);
Console.WriteLine(text);
}
}
请参阅联机C#演示。
正则表达式是
(?s)$(?<functionName>w+)('?(?<value>[^'\]*(?:\.[^'\]*)*)'?)$
请参阅在线regex演示详细信息:
(?s)
-一个RegexOptions.Singleline
内联正则表达式选项,使.
与包括换行符在内的任何字符匹配$
-美元符号- CCD_ 11-组";functionName":一个或多个单词字符
(
-一个(
字符'?
-可选的'
字符- CCD_ 16-组";值":除了
'
和之外的零个或多个字符,然后出现零个或更多的任何转义字符,然后是除了
'
和之外的0个或更多个字符
'?)
-')
或)
字符串$
do {...} while (prev != text)
搜索并替换text
变量中的匹配项,直到找不到匹配项为止。