2014-06-18 86 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*  | ([^ ]*) 
    _ _ _ _ |_________