正则表达式 - 如何使前瞻模式

时间:2012-01-19 14:45:51

标签: c# .net regex

我需要创建正则表达式来验证包含通配符的字符串。表达式必须采用移动电话号码(xxx-xxx-xxxx)的形式,其中x是数字号码或问号。在这种情况下,regexp足够直^([\d?{3}]-[\d?{3}]-[\d?{4}])$但是当用户请求*外卡时,我真的很困惑。

首先它可以是xxx-xxx-*,对吧?但xxx-xxx-**xxx-*-*一样无效。我读了一些关于前瞻模式的东西(用C#编写)但是只是混淆了更多。我试图编译像^(?![\\*\\*])$这样的东西 - “不是彼此靠近的两个星号”,但它不起作用。

那么,还有更多想法吗?

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解了你的要求,但听起来我觉得你想要一个匹配的模式:

任选

  • 一到三个数字或?后跟-
  • 一到三个数字或?后跟-
  • 一到四个数字或?后跟-

这应匹配

123-456
12?-4??-78??
1-3?-2?0

但不匹配

1--123
-?-23
1233-23?-234

在这种情况下,您不需要前瞻

此模式应该有效

^([\?\d]{1,3})(\-[\?\d]{1,3}(\-[\?\d]{1,4})?)?$

Try it here

答案 1 :(得分:0)

这会使你的表达有一些修正

^[\d?]{3}-[\d?]{3}-[\d?]{4}$

我移动了结束方括号,量词必须在字符类之外,我也删除了最外面的括号,因为它们没有意义。

现在向前瞻。

如果你想禁止“**”

^(?!.*\*\*)[\d?]{3}-[\d?]{3}-[\d?]{4}$

我不确定您对“*”的使用要求。字符串中只允许一个吗?

类似于禁止“ - ”

^(?!.*\*\*)(?!.*--)[\d?]{3}-[\d?]{3}-[\d?]{4}$