关于正则表达式的怀疑

时间:2017-09-25 13:34:23

标签: c# regex

我有一个像"/"这样的字符串,这两个数字的长度没有任何限制,在它之间可以是任何东西,在这个例子中我展示了"([\a-z]*?) (.) ([\a-z]*?) "但它可以是一个字母,一个元音,甚至一个数字,但它们之间有一个空格,这是一个分界符。

如何创建正则表达式来解决它?

另外,正则表达式也适用于此方案“789787987897”,没有分隔符和第二个数字。

我尝试了类似docker run -v /home/<host user>/.ssh:/home/<docker user>/.ssh <image> 的内容,但没有成功。

3 个答案:

答案 0 :(得分:5)

此表达式应该有效:

^(\d+)\D*?(\d*)$

我们的想法是在字符串\d+的开头与^匹配尽可能多的数字,然后与\D*?匹配尽可能少的非数字,最后匹配字符串$末尾的零个或多个数字。

Demo.

请注意\d+\d*周围的括号:他们正在设置正则表达式捕获组。您可以使用这些组从C#代码中获取与正则表达式匹配的数字。

注意:如果您想在&#34;之间的&#34;空格中允许数字,请使用.*代替\D*

答案 1 :(得分:3)

我建议使用 achors 以获取第一个最后数字:

  string pattern = @"^(?<first>[0-9]+)(\s+.*\s+(?<last>[0-9]+))?$";

测试

  string[] tests = new string[] {
    "8798798778979878978", // one number 
    "123 456 789",         // number 456 is a delimiter 
    "123 / 456",           // delimiter is / 
    "123 /456",            // failed delimeter / (no space after /), no match
    "abc"                  // no match
  };

  var report = tests
    .Select(line => new {
      line = line,
      match = Regex.Match(line, pattern)
    })
    .Select(item => item.match.Success
       ? $"{item.line,-30} first: {item.match.Groups["first"].Value,-20} last: {item.match.Groups["last"].Value,-20}"
       : $"{item.line,-30} NO MATCH");

   Console.WriteLines(string.Join(Environment.NewLine, report));

结果:

8798798778979878978            first: 8798798778979878978  last:                     
123 456 789                    first: 123                  last: 789                 
123 / 456                      first: 123                  last: 456                 
123 /456                       NO MATCH
abc                            NO MATCH

答案 2 :(得分:1)

这样的事可能有用:

require "spidr"
require "open-uri"
Spidr.site('http://example.com') do |spider|
  spider.every_url do |url|
    link= url+"?foo=bar"
    response = open(link).read
  end
end