【问题标题】:Regex match with multiple occurrences正则表达式匹配多次出现
【发布时间】:2015-09-19 05:04:38
【问题描述】:
使用类似于示例的字符串
90001:21880004:los angeles
10001:21880005:new york
我想通过正则表达式提取最后的城市名称。我发现这两个 : 很难做到,有人能指出我正确的方向吗?
【问题讨论】:
标签:
c#
visual-studio-2013
regex-negation
【解决方案1】:
你可以使用如下的正则表达式:
(\d+:)+([A-Za-z\s]+)
您可以在哪里捕获编号组(\d+:)+
然后文本 ([A-Za-z\s]) 将捕获大多数城市名称。
至少这是它的基本要点。
【解决方案2】:
如果你真的想使用正则表达式:
^\d+:\d+:(.+)$ 应该可以工作。
([^\d:]+) 也应该可以工作。
然而,看起来你真的只是想做一个拆分。
"11111:111111:name".Split(':')[2] 可能是您最快的方法。
【解决方案3】:
您可以使用String.Split,而不是使用正则表达式
string line = "90001:21880004:los angeles";
string cityName = line.Split(':')[2]; // Gives 'los angeles'
这会将字符串分成三部分(因为您有两个 :s)并取第三部分(请记住,数组是从 0 开始的),其中包含您的城市名称。
请确保您的数据集中没有城市的名称中包含 :。
【解决方案4】:
没有Regex你也可以做到这一点:
string la = "90001:21880004:los angeles".Split(':')[2];
string ny = "10001:21880005:new york".Split(':')[2];
【解决方案5】:
如果你知道有 2 个冒号,你可以这样做:
\d:\d:([a-zA-Z\s]+)
通过不在数字周围添加括号,它们不会被正则表达式捕获。
【解决方案6】:
又一个正则表达式
string pattern = @"[^:]+";
var city = Regex.Match(text, pattern, RegexOptions.RightToLeft);