我想写一个正则表达式,只从输入中选择实际的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
答案 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]
是指定( )
构造时的单独捕获。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"].Value
或mymatch.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