匹配已知字符之间的字符串

时间:2014-06-18 15:19:07

标签: c# .net regex

我有几千行文字来获取特定的测量结果。这些行总是采用相同的格式:

'0980 - 14'3 - Plough Yard - London EC2A 3'
'0981 - 14'3 - Waterson St - London E2 8'
'0982 - 14'3 - Union Walk - London E2 8'
'0983 - 14'3 - Union Walk - London E2 8'
'0984 - 14'3 - Hare Row - London E2 9'
'0985 - 14'3 - Sharratt St - London SE15 1'
'0986 - 14'3 - Rolt St - London SE8 5'
'0987 - 14'3 - Edward St - London SE8 5'

因为我对正则表达式的了解很差,所以我唯一想到的就是:

\-(.*?)\-

哪些(那些对这些随机字符串有更大意识的人,可以看到)也将在另一方面匹配。我需要的只是14'3部分。我无法理解最左边的数字也会变得多大,可能会达到数十万。

更新 显然我的模式字符串确实可以工作。我用来构建和测试它的网站是错误的。非常感谢你的帮助!

5 个答案:

答案 0 :(得分:1)

试试这个正则表达式。

^.*?\-(.*?)\-

这个正则表达式的作用是,它只捕获正则表达式组中-之间第二次出现的内容。

http://rubular.com/r/wAxtbQT4wb

答案 1 :(得分:1)

你可以非常具体到非常一般。

这个正则表达式非常具体:

^'\d+\s+-\s+(\d\d'\d)

See it work

这很一般:

(\d+'\d+)

See that work

答案 2 :(得分:1)

怎么样:

- (\d+'\d+) - 

这将匹配每个14'3

答案 3 :(得分:1)

你也可以试试这个正则表达式,

^'[0-9]+\s*-\s*([^ ]*)

DEMO

<强>解释

    '0980 - 14'3 - Plough Yard - London EC2A 3'
   _|   |   |  |
^'[0-9]+|   |  |
_ _  _ _|   |  |_____
\s*-\s*     |  ([^ ]*)
   _ _ _ _  |_________

答案 4 :(得分:1)

我想指出你的模式在.NET正则表达式引擎中工作,没有任何其他选项。这是一个演示(我删除了不必要的反斜杠):

var input = @"'0980 - 14'3 - Plough Yard - London EC2A 3'
'0981 - 14'3 - Waterson St - London E2 8'
'0982 - 14'3 - Union Walk - London E2 8'
'0983 - 14'3 - Union Walk - London E2 8'
'0984 - 14'3 - Hare Row - London E2 9'
'0985 - 14'3 - Sharratt St - London SE15 1'
'0986 - 14'3 - Rolt St - London SE8 5'
'0987 - 14'3 - Edward St - London SE8 5'";

foreach(Match m in Regex.Matches(input, "-(.*?)-")) 
{
    Console.WriteLine(m.Groups[1].Value);
}

这是因为.匹配除换行符之外的任何字符(除非您使用'Single-line' mode使其也匹配换行符)。只要字符串中没有一行在-之后有另一个London …,它就只匹配第一对-之间的子字符串。

但是,对于像这样相对简单的事情,您可以改为使用Split

foreach(var line in input.Split('\n')) 
{
    Console.WriteLine(line.Split(new[] { '-' }, 3)[1]);
}