我想匹配“100”、“1.1”、“5.404”等数字,如果它们前面不包含这样的字母:“V102”。
这是我当前的正则表达式:
(?<![A-Za-z])[0-9.]+
这应该匹配任何字符 0-9。一个或多个重复,如果前缀不存在 (A-Za-z)。
但它所做的是将 V102 匹配为 02,所以它只是去掉 V 和一个字母,然后其余的都适合,而实际上它根本不应该匹配那个大小写。我怎样才能让它抓住所有数字,然后检查前缀是否不存在?
将数字和小数点添加到您的负面回顾中:
(?<![A-Za-z0-9.])[0-9.]+
这将强制所有匹配以非数字和非字母(即空格或其他分隔符)开头。这样,数字的结尾也不是有效匹配。
你可以使用单词边界吗?
\b[0-9\.]+\b
试试正则表达式:
(?<![A-Za-z0-9])[0-9.]+
如果您不希望字符串中的任何位置出现字母或空格,那么这应该可以:
^[0-9.]+$
非正则表达式解决方案。
如果您有以下字符串,那么您可以使用double.TryParse
来查看该字符串是否为双精度。尝试:
string str = "100 1.1 V100 d333 ABC 1.1";
double temp;
string[] result = str.Split().Where(r => (double.TryParse(r, out temp))).ToArray();
或者,如果您需要一个双数组作为回报,那么:
double[] numberArray = str.Split()
.Where(r => double.TryParse(r, out temp))
.Select(r => double.Parse(r))
.ToArray();
尝试使用插入符号^
运算符。此运算符表示您希望您的模式从输入的开头开始。例如^[0-9.]+
,将匹配以数字或 a 开头.
并具有任意数量的输入。请注意,此模式不只匹配数字,因为它也匹配超过 1 个点的模式,例如2.00.2
,它不是一个有效的数字。