我还是一个正则表达式的宝宝,需要一些解析字符串的帮助。
我正在使用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)
答案 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替换找到的标识符。它有Index
和Length
属性,可以告诉您标识符在等式中的确切位置。然后可以使用字符串函数替换。但请确保以相反的方式迭代匹配,以保留尚未处理的标识符的位置。
您必须以某种方式获取与标识符相对应的值。 Dictionary(Of String, Double)
是保存值的理想选择。关键是标识符。