.net 6 值转换器中的正则表达式问题
Regular expression issues in .net 6 value converter
我正在尝试学习一些 .net6 和 c#,但我在正则表达式方面遇到了很多困难。如果相关的话,更具体地说是 Windows 中的 Avalonia。
我正在尝试做一个带有 2 个文本框的小应用程序。我在一个上写文本,然后使用值转换器在另一个上“过滤”文本。
我想过滤数学表达式以便稍后尝试解决它们。一些简单的东西,一种编写文本数学并实时获得结果的方法。
几个星期以来,我一直在尝试自己计算这个正则表达式,但没有成功。
我想在我的字符串中将“_Expression{BLABLA}”替换为“BLABLA”。为了测试我的表达式,我一直在检查 http://regexstorm.net/ and https://regex101.com/ 并且根据它们我的匹配应该是正确的(除非我误解了结果)。但是我的小应用程序的结果对我来说非常奇怪 我最终决定寻求帮助。
这是我的代码:
private static string? FilterStr(object value)
{
if (value is string str)
{
string pattern = @"\b_Expression{(.+?)\w*}";
Regex rgx = new(pattern);
foreach (Match match in rgx.Matches(str))
{
string aux = "";
aux = match.Value;
aux = Regex.Replace(aux, @"_Expression{", "");
aux = Regex.Replace(aux, @"[\}]", "");
str = Regex.Replace(str, match.Value, aux);
}
return new string(str);
}
return null;
}
那么一些示例输入的结果是:
输入:
Some text
_Expression{x}
_Expression{1}
_Expression{4}
_Expression{4.5} _Expression{4+4}
_Expression{4-4} _Expression{4*x}
_Expression{x/x}
_Expression{x^4}
_Expression{sin(x)}
输出:
Some text
x
1{1}
1{4}
1{4.5} 1{4+4}
1{4-4} 1{4*x}
1{x/x}
1{x^4}
1{sin(x)}
或
输入:
Some text
_Expression{x}
_Expression{4}
_Expression{4.5} _Expression{4+4}
_Expression{4-4} _Expression{4*x}
_Expression{x/x}
_Expression{x^4}
_Expression{sin(x)}
输出:
Some text
x
_Expression{4}
4.5 _Expression{4+4}
4-4 _Expression{4*x}
x/x
_Expression{x^4}
_Expression{sin(x)}
这种行为让我感到很困惑。我不明白为什么“(.+?)”对其中一些不起作用,而对其他一些起作用……或者也许我没有正确定义某些东西或者我的替换是错误的?看不到...
非常感谢抽出宝贵时间! :)
您的正则表达式中有一些缺失的部分,例如它没有转义大括号 {
和 }
,因为大括号在正则表达式中具有特殊含义;它们被用作 quantifiers.
使用下面的那个。
为了提取花括号之间的数学表达式,它使用名称为 mathExpression
.
的 named capturing group
_Expression\{(?<mathExpression>.+?)\}
_Expression\{
: 从固定文本开始_Expression{
(?<mathExpression>
: 启动一个名为 mathExpression
的命名捕获组
.+?
: 以非贪婪的方式取下一个字符
)
: 结束命名的捕获组
\}
: 以固定字符 }
结束
下面的例子将输出 2 个匹配项
Regex regex = new(@"_Expression\{(?<mathExpression>.+?)\}");
var matches = regex.Matches(@"_Expression{4.5} _Expression{4+4}");
foreach (Match match in matches.Where(o => o.Success))
{
var mathExpression = match.Groups["mathExpression"];
Console.WriteLine(mathExpression);
}
输出
4.5
4+4
我正在尝试学习一些 .net6 和 c#,但我在正则表达式方面遇到了很多困难。如果相关的话,更具体地说是 Windows 中的 Avalonia。 我正在尝试做一个带有 2 个文本框的小应用程序。我在一个上写文本,然后使用值转换器在另一个上“过滤”文本。 我想过滤数学表达式以便稍后尝试解决它们。一些简单的东西,一种编写文本数学并实时获得结果的方法。 几个星期以来,我一直在尝试自己计算这个正则表达式,但没有成功。 我想在我的字符串中将“_Expression{BLABLA}”替换为“BLABLA”。为了测试我的表达式,我一直在检查 http://regexstorm.net/ and https://regex101.com/ 并且根据它们我的匹配应该是正确的(除非我误解了结果)。但是我的小应用程序的结果对我来说非常奇怪 我最终决定寻求帮助。 这是我的代码:
private static string? FilterStr(object value)
{
if (value is string str)
{
string pattern = @"\b_Expression{(.+?)\w*}";
Regex rgx = new(pattern);
foreach (Match match in rgx.Matches(str))
{
string aux = "";
aux = match.Value;
aux = Regex.Replace(aux, @"_Expression{", "");
aux = Regex.Replace(aux, @"[\}]", "");
str = Regex.Replace(str, match.Value, aux);
}
return new string(str);
}
return null;
}
那么一些示例输入的结果是: 输入:
Some text
_Expression{x}
_Expression{1}
_Expression{4}
_Expression{4.5} _Expression{4+4}
_Expression{4-4} _Expression{4*x}
_Expression{x/x}
_Expression{x^4}
_Expression{sin(x)}
输出:
Some text
x
1{1}
1{4}
1{4.5} 1{4+4}
1{4-4} 1{4*x}
1{x/x}
1{x^4}
1{sin(x)}
或 输入:
Some text
_Expression{x}
_Expression{4}
_Expression{4.5} _Expression{4+4}
_Expression{4-4} _Expression{4*x}
_Expression{x/x}
_Expression{x^4}
_Expression{sin(x)}
输出:
Some text
x
_Expression{4}
4.5 _Expression{4+4}
4-4 _Expression{4*x}
x/x
_Expression{x^4}
_Expression{sin(x)}
这种行为让我感到很困惑。我不明白为什么“(.+?)”对其中一些不起作用,而对其他一些起作用……或者也许我没有正确定义某些东西或者我的替换是错误的?看不到...
非常感谢抽出宝贵时间! :)
您的正则表达式中有一些缺失的部分,例如它没有转义大括号 {
和 }
,因为大括号在正则表达式中具有特殊含义;它们被用作 quantifiers.
使用下面的那个。
为了提取花括号之间的数学表达式,它使用名称为 mathExpression
.
_Expression\{(?<mathExpression>.+?)\}
_Expression\{
: 从固定文本开始_Expression{
(?<mathExpression>
: 启动一个名为mathExpression
的命名捕获组
.+?
: 以非贪婪的方式取下一个字符)
: 结束命名的捕获组\}
: 以固定字符}
结束
下面的例子将输出 2 个匹配项
Regex regex = new(@"_Expression\{(?<mathExpression>.+?)\}");
var matches = regex.Matches(@"_Expression{4.5} _Expression{4+4}");
foreach (Match match in matches.Where(o => o.Success))
{
var mathExpression = match.Groups["mathExpression"];
Console.WriteLine(mathExpression);
}
输出
4.5
4+4