C#正则表达式向前看S

时间:2018-04-15 11:55:44

标签: c# regex

我想验证一个string,看它是否至少有6位数且至少有1 int

 string text = "I want to run 10 miles daily";
 string pattern = @"(?=\.*\d).{6,}";
 Match match = Regex.Match(text, pattern);
 Console.WriteLine(match.Value);

请解释我为什么得到以下输出:

"每天10英里"

4 个答案:

答案 0 :(得分:0)

\.*\d这意味着字符串以数字结尾。

(?=\.*\d)这会占用字符串

中的目标数字

(?=\.*\d).此模式在字符串中表示找到数字后的所有内容。

(?=\.*\d).{6,} digit之后的每个字符必须至少包含6个字符。

你需要这个正则表达式:(?=.*\d).{6,}$。结果返回至少6个字符并且至少有一个是数字

答案 1 :(得分:0)

我知道这并没有回答你的问题,但我认为你正在寻找一个有效的RegEx。你的陈述是I want to validate a string to see if it is at least 6 digits long and has at least 1 int.。我认为你的意思是at least 6 characters long (including white space) and has at least 1 int.

这应该这样做(C#):

@"^(?=.*\d+)(?=.*[\w]).{6,}$";

RegEx Analyzer:UltraPico Expresso RegEx Tool

enter image description here

测试代码和输出(C#)

tatic void Main(string[] args)
{
    string text = "abcdef";
    Match match;
    string pattern = @"^(?=.*\d+)(?=.*[\w]).{6,}$";

    match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    Console.WriteLine("Text:'"+text + "'. Matched:" + match.Success + ". Value:" + match.Value);

    text = "abcdefg";
    match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    Console.WriteLine("Text:'" + text + "'. Matched:" + match.Success + ". Value:" + match.Value);

    text = "abcde1";
    match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    Console.WriteLine("Text:'" + text + "'. Matched:" + match.Success + ". Value:" + match.Value);

    text = "abcd21";
    match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    Console.WriteLine("Text:'" + text + "'. Matched:" + match.Success + ". Value:" + match.Value);

    text = "abcd dog cat 21";
    match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    Console.WriteLine("Text:'" + text + "'. Matched:" + match.Success + ". Value:" + match.Value);

    Console.ReadKey();
}

enter image description here

答案 2 :(得分:0)

你得到“每天10英里”的原因是因为你指定了一个正向前瞻(?=\.*\d),它与一个零点或更多次的文字点匹配,然后是一个数字。

该断言在1之前的位置成功,它匹配零点数然后是数字:

I want to run 10 miles daily
..............|

从那一刻起,您匹配任何符合.{6,}匹配的任何字符零次或多次:

I want to run 10 miles daily
              ^^^^^^^^^^^^^^ 

您可以更新正则表达式以删除点之前的反斜杠,并使用锚点断言该行的开始^和结束$

^(?=.*\d).{6,}$

匹配

  • ^断言一行
  • (?=.*\d)肯定断言后面包含数字的内容
  • .{6,}再次匹配任何角色
  • $断言一行

答案 3 :(得分:0)

\.*\d  => means a digit preceded by literal dots(`.`) 

*表示重复(0 ~ ) numbers字符,点(.)。

因此,正如您所看到的,输入字符串中没有字符点(.)。因此,正则表达式引擎通过将*的重复数字评估为zero0来尝试进行匹配。

因此,您的正则表达式可能会被解释如下。

(?=\d).{6,}

是的,这个正则表达式意味着one digit后面跟着超过5个任意字符的数字。

但是,{6,}表示搜索greedy的{​​{1}}搜索。另一方面,possible maximum length string模式(在这种情况下为lazy)搜索可能的最小长度字符串。

您可以尝试使用此{6,}?正则表达式,并与上述lazy mode结果进行比较。

greedy