[英]Evaluate boolish expression string at runtime
如何評估類似於以下示例的表達式字符串? 我正在尋找一種解析它們的簡便方法。
string1: "True and False"
bool: false
string1: "False and False"
bool: false
string1: "true or False"
bool: true
只要它始終遵循示例中給出的簡單結構,就可以使用:
private static readonly Regex boolParseRegex =
new Regex(@"^(true|false) (and|or) (true|false)$", RegexOptions.IgnoreCase);
public bool ParseExpression(string expr)
{
var res = boolParseRegex.Match(expr);
bool val1 = bool.Parse(res.Groups[1].Value);
bool isAnd = string.Equals(res.Groups[2].Value, "and",
StringComparison.InvariantCultureIgnoreCase);
bool val2 = bool.Parse(res.Groups[3].Value);
return isAnd ? val1 && val2 : val1 || val2;
}
如果您希望能夠解析更多的通用表達式(例如,除了"false and true"
之外還包括"true"
, "(true and false) or true"
"false and true"
),則應該看一下Irony ,如轉換字符串中的建議布爾表達式的答案的表達式 (感謝Frode對此進行評論)。
如果您實現解析器或使用解析庫,則可能會實現您想要的。 基本上,您需要將表達式分解為各個組成部分,然后將它們解釋為邏輯塊。 您的樣本包含兩種類型,值和運算符。
讓我們在第一個示例True AND False
上嘗試一下:
True <- value : Carry it over
AND <- operator : store
False <- Value : Use stored Operation on Carried value. Carry it over.
End of expression
如果添加分組,事情會變得更加復雜,因為您需要將序列存儲在通常稱為表達式樹的結構中,因為它是分層的,需要您從“葉”(離根最遠)開始解析每個組。 。 讓我們使用以下示例:
False XOR (True AND False) OR (True OR False)
表達式樹如下所示:
Root Group : False XOR G1 OR G2
Group 1 : True AND False
Group 2 : True OR False
使用表達評估器,您首先需要求解組1和2:
Root Group : False XOR G1 OR G2
Group 1 : False
Group 2 : True
然后將其應用於“根”組:
Root Group : False XOR False OR True
False <- value : Carry it over
XOR <- operator : store
False <- value : Apply stored Operation (result True). Carry it over.
AND <- operator : store
False <- Value : Apply stored Operation (result True). Carry it over.
- End of expression
基本上,這就是表達式解析器的工作方式。
編輯:弗洛德(Frode)在對您的問題的評論中指出的諷刺意味深長,它是一種知名的語言解析器,可以為您解決問題。 我記得有一陣子讀過,但是他比我快。 =)
一些簡單的事情可能是:
static bool string_parser(string str_to_parse)
{
bool result= false;
string[] parts = str_to_parse.Split(' ');
if (parts.Length == 3)
{
if (parts[0].ToLower().Contains("true"))
{
result = true;
}
if (parts[1].ToLower().Contains("or"))
{
if (parts[2].ToLower().Contains("true"))
{
result= result || true;
}
}
else if (parts[1].ToLower().Contains("and"))
{
result = parts[2].ToLower().Contains("true") ? result && true : result && false;
}
}
return result;
}
但是我想知道False && False在這個例子中不應該是'True'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.