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

本文关键字:字符串 之间 字符 | 更新日期: 2023-09-27 18:09:05

我有几千行文本来获取特定的测量值。这些行始终采用相同的格式:

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

显然我的模式串还是管用的。我用来构建和测试它的站点是错误的。非常感谢你的帮助!

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

我想指出,你的模式在没有任何其他选项的情况下,就像在。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);
}

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

但是,对于像这样相对简单的东西,您可以使用Split代替:

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

试试这个正则表达式。

^.*?'-(.*?)'-

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

http://rubular.com/r/wAxtbQT4wb

如何:

- ('d+''d+) - 

这将匹配所有14'3

可以很具体也可以很一般

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

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

看效果

这是非常通用的:

('d+''d+)

查看工作

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

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

演示

解释:

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