2014-06-18 52 views
0

我已经有几千行文字来获取特定的测量值。该行总是在相同的格式:匹配已知字符之间的字符串

'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部分。我不能赞成最左边的数字有多大,可能会达到数十万。

更新 显然我的模式字符串确实工作。我用来构建和测试的站点存在错误。非常感谢您的帮助!

+0

这应该工作,只要你把它应用到一条线在时间,或者如果你不使用'dotall' (或等价物)。你使用什么语言/平台? –

+0

@pswg我的猜测是他不想和'Plow Yard'匹配 –

+0

我现在实际上并没有使用任何语言,我现在在这个网站上:http:// www。 freeformatter.com/regex-tester.html - 随机抽取数据,尝试自己做。 :(最终它会是C# – LokiSinclair

回答

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]); 
} 
1

试试这个正则表达式。

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

这个表达式做什么,是不是仅捕获的正则表达式组内-之间内容的第二occurence。

http://rubular.com/r/wAxtbQT4wb

1

你可以非常具体的很一般。

这正则表达式是相当具体:

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

See it work

这是非常普遍的:

(\d+'\d+) 

See that work

1

如何:

- (\d+'\d+) - 

这将匹配每一个14'3

1

你可以试试这个表达式也

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

DEMO

说明:

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