如何只选择中间带有特定字符串的数字

时间:2017-04-30 18:32:04

标签: c# regex

我想写一个正则表达式,只从输入中选择实际的GPS坐标(不是范围)。(/ p>

这个正则表达式返回我想要的但包括单词,我只想要数字:

(actual (lat|lon) (\d+(.\d{1,6})))|((\d+(.\d{1,6})) (lat|lon))

所以我想排除:

(actual (lat|lon) | (lat|lon))

我该怎么做?

输入:

49.212087纬度,16.626133经度

纬度范围:49.000000至50.000000实际纬度49.212059离子范围:16.000000至17.000000实际离子16.626276

49.21199纬度,16.626446经度

纬度范围:49.000000至50.000000实际纬度49.212073离子范围:16.000000至17.000000实际离子16.626333

4 个答案:

答案 0 :(得分:1)

你有太多不必要的群体。此外,由于您实际上需要2个组来匹配相同类型的值,因此您可以使用命名的捕获组,并使用正则表达式获取所有必需的匹配项

      <md-input-container>
        <input mdInput placeholder="email" [formControl]="emailFormControl">
        <md-error *ngIf="emailFormControl.hasError('required')">
          This field is required
        </md-error>
        <md-error *ngIf="emailFormControl.hasError('pattern')">
          Please enter a valid email address
        </md-error>
      </md-input-container>

请参阅regex demo。如果使用actual (?:lat|lon) (?<val>\d+\.\d{1,6})|(?<val>\d+\.\d{1,6}) (?:lat|lon) 标志,则可以将捕获组用作非捕获组(仅指定的捕获组将保留其子匹配)。请参阅C# demo

RegexOptions.ExplicitCapture

如果您将var s = "lat range: 49.000000 to 50.000000 actual lat 49.212059 lon range: 16.000000 to 17.000000 actual lon 16.626276"; var pattern = @"actual (lat|lon) (?<val>\d+\.\d{1,6})|(?<val>\d+\.\d{1,6}) (lat|lon)"; var results = Regex.Matches(s, pattern) .Cast<Match>() .Select(m => m.Groups["val"].Value) .ToList(); Console.WriteLine(string.Join("\n", results)); // => 49.212059 // 16.626276 放入指定的捕获组,您将能够获得字典:

(lon|lat)

请参阅another C# demo

答案 1 :(得分:0)

这是正在运行的regexp(link to test):

((?<=actual\s(lat|lon)\s)(\d+(.\d{1,6})))|((\d+(.\d{1,6}))(?=\s(lat|lon)))

您可以找到有关其工作原理的更多信息http://codeasp.net/blogs/microsoft-net/293/c-regex-extract-the-text-between-square-brackets-without-returning-the-brackets-themselves

答案 2 :(得分:0)

如果我正确地查询了你的查询,这个正则表达式应该适合你:

(?<=(actual (lat|lon) ))(\d+(.\d{1,6}))|(?<!((lat|lon) range: ))(\d+(.\d{1,6}))(?=( (lat|lon)))

另请参阅Regexstorm

上的测试结果

您可以在此主题中了解有关回顾和前瞻的更多信息: Regex lookahead, lookbehind and atomic groups

答案 3 :(得分:0)

  

这个正则表达式返回我想要的但包括单词,我只想要数字:

在正则表达式领域,匹配捕获和基本分组之间存在差异。由于( )构造,您告诉它匹配并捕获

记住这些项目。

  • Groups[0] 始终 整场比赛
  • Groups[1-N]是指定( )构造时的单独捕获。
  • 仅提取索引值为&gt;的捕获组中的数据(您提及的数字); 0.只需要完整匹配时,只能使用Groups[0]

<强> ([\d.]+)\s(\D+)

在数据上使用此模式,您可以获得这两个匹配

Match #0
          [0]:  49.212087 latitude, 
  ["1"] → [1]:  49.212087
  ["2"] → [2]:  latitude, 

Match #1
          [0]:  16.626133 longitude
  ["1"] → [1]:  16.626133
  ["2"] → [2]:  longitude

命名捕获

如果使用了名为(?<{name here})的名称,则可以通过mymatch.Groups["Data"].Valuemymatch.Groups[1].Value等命名组访问信息。

<强> (?<Data>[\d.]+)\s(?<What>\D+)

这种模式的使用具有这些匹配和组捕获,这些匹配和组捕获可以通过int索引,但也可以通过引用的字符串&#34;数据&#34;和&#34;什么&#34;:

Match #0
             [0]:  49.212087 latitude, 
  ["Data"] → [1]:  49.212087
  ["What"] → [2]:  latitude, 

Match #1
             [0]:  16.626133 longitude
  ["Data"] → [1]:  16.626133
  ["What"] → [2]:  longitude