从VB中的字符串中提取与模式匹配的字符组

时间:2016-02-26 20:55:50

标签: regex vb.net string parsing

我还是一个正则表达式的宝宝,需要一些解析字符串的帮助。

我正在使用VB,并打算通过NCalc运行一个字符串,NCalc是一个从字符串中解析数学方程式的库。

问题是,方程式将包含数字,操作变量。

等式可能如下所示:

P20*4.143/((N2+N3)/2)

如您所见,P20,N2和N3是变量。在我的例子中,它们存储在我的应用程序的其他地方的数据表中。

我需要做的是解析字符串,在操作之间寻找字符 groups ( - + / *),获取实际值并替换变量与原始字符串中的值同时忽略实际数字。

上面的字符串应该成为:

120.5*4.143/((4500+4570)/2)

这样的事情:

Dim equation = "P20*4.143/((N2+N3)/2)"

For Each match As String In Regex(match_all_groups_with_letters)
    return replace(match, value)
Next

然后我可以做类似的事情:

finalResult = NCalc.Doyourmagic(equation)

2 个答案:

答案 0 :(得分:1)

您可以使用像

这样的简单模式
"\b\d*\p{L}[\p{L}\d]*\b"

请参阅regex demo

它匹配前导词边界\b,零个或多个数字(\d*),一个字母(\p{L}),以及零个或多个数字或字母([\p{L}\d]* )后跟一个尾随字边界(\b)。

相应地调整量词(如果数字始终存在,请使用\d+代替\d*)。如果字母只能是ASCII字母,请使用[A-Za-z](或仅使用大写ASCII - [A-Z])而不是\p{L}(匹配所有Unicode字母)。

答案 1 :(得分:0)

假设变量名称始终以字母开头,可能包含数字

Dim equation = "P20*4.143/((N2+N3)/2)"
Dim pattern = "[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*" ' Can start and end with numbers,
                                                 ' must contain at least one letter.

Dim matches = Regex.Matches(equation, pattern)
For Each m As Match In matches
    Dim value = GetValueFor(m.Value)
    equation = Regex.Replace(equation, "\b" & m.Value & "\b", value)
Next

\b标记单词的开头或结尾。方括号[]包含字符组。星号*表示前一操作的零次,一次或多次重复。所以我们有任意数量的字母和数字重复,然后是一个字母,最后是字母和数字的重复次数。

您可以使用匹配中提供的信息,而不是重新使用Regex替换找到的标识符。它有IndexLength属性,可以告诉您标识符在等式中的确切位置。然后可以使用字符串函数替换。但请确保以相反的方式迭代匹配,以保留尚未处理的标识符的位置。

您必须以某种方式获取与标识符相对应的值。 Dictionary(Of String, Double)是保存值的理想选择。关键是标识符。