检查字符串的一部分是否与正则表达式匹配

4

我正在尝试根据各种正则表达式验证字符串;然而,如果空格字符被添加到字符串结尾,它们就不会再被标记了。

if (Regex.IsMatch(literal.Value.ToString().ToLower(), @"^\+?[0-9\-\(\)\.\/]{8,20}$")
{
    //Logic
}

在下面的代码中,X值被标记,但Z值未被标记。
string x = "0337350670"; // Gets flagged
string z = "0337350670     "; // Does not get flagged

我应该改变正则表达式还是有一种方法可以针对字符串的一部分进行验证?

3个回答

4
您可以使用 Trim 方法来去除字符串两端的空格。
此外,在字符类中,许多特殊的正则表达式字符不再具有特殊意义(- 仍然是特殊字符,但如果您这样使用 [...-],它会被转义)。
Regex.IsMatch(literal.Value.ToString().ToLower().Trim(),
              @"^\+?[0-9()./-]{8,20}$"

去掉^$也可以达到同样的效果,但需要注意的是这会允许字符串中连续出现超过20个数字的情况:你已经不再检查最大长度(任何包含[0-9()./-]{8}的内容都会匹配)。

如果我有这样的东西“1283712323 327462387462”,会发生什么?修剪后的字符串会变成“1283712323327462387462”吗? - Matthijs
不对,Trim 只是用来删除尾部空格的:请参阅文档 - Robin
我喜欢你提到去掉 $ 可以允许20位以上的字符串,因为这是关键因素。你的方法最适合! - Matthijs
@Matthijs:很高兴我能帮到你! - Robin

3

将正则表达式中的^$去掉,可以使表达式匹配字符串中的任何位置。


这里你也需要在开头和结尾添加 *,是吗? - Veikedo
我实际上检查过了,那不是必需的,如果你去掉^和$也可以工作。 - Matthijs
+1 去掉 $ 是最快的方法。@Matthijs 只是一个旁注,如果你只想允许末尾有空格,你可以使用 "^\+?[0-9\-\(\)\.\/]{8,20}\s*$" 匹配。 - Me.Name
"0337350670sometext" 确实会被标记,这就是为什么这不是我想要的合适答案;请看罗宾提出的 Trim 选项。 - Matthijs
@Veikedo 不会,默认情况下,正则表达式将匹配字符串中的任何位置。 "^" 和 "$" 只是其他符号,类似于 \b 匹配单词边界等,用于匹配字符串的开头和结尾。 - phuzi
显示剩余2条评论

1
你可以从字符串末尾删除 $ 字符,并添加 .*:
if (Regex.IsMatch(literal.Value.ToString().ToLower(), @"^\+?[0-9\-\(\)\.\/]{8,20}.*")
{
    //Logic
}

现在它将匹配两个:演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接