我目前正在为数学表达式编写解析器,并且遇到以下情况: 用户可以使用参数(单词)或数字来定义公式。因此,我需要将给定的字符串解析为单词或数字,可以是整数或浮点数,我想保存结果,例如作为“左手边”(lhs): 不幸的是我对正则表达式有疑问:
我尝试过类似的事情:
Match m1 = Regex.Match("variable", @"^(?<lhs>((\w+)|(([0-9]+)(\.([0-9]*))?)))");
Match m2 = Regex.Match("1.2", @"^(?<lhs>((\w+)|(([0-9]+)(\.([0-9]*))?)))");
预期结果将是我得到一个“ lhs”组,其中包含m1的字符串“ variable”或m2的“ 1.2”。实际结果是我在m1中得到了整个单词“ variable”,但是在m2中为数字的情况下,只有第一个数字“ 1”是匹配的。 如果排除出现“ 1.2”一词的可能性,则:
Match m3 = Regex.Match("1.2", @"^(?<lhs>(([0-9]+)(\.([0-9]*))?))");
有人可以在这里帮助我吗?
答案 0 :(得分:1)
\w+
模式匹配字母,数字和其他一些字符,包括_
。由于它是交替组中的第一部分,因此,一旦它与数字匹配,就永远不会再使用第二种选择。
您可以交换分支,并使用类似的东西
^(?<lhs>(?<num>[0-9]+(?:\.[0-9]*)?)|(?<word>\w+))
或者,如果整个字符串应该匹配:
^(?<lhs>(?<num>[0-9]+(?:\.[0-9]*)?)|(?<word>\w+))$
请参见.NET regex demo。