在已知字符之间匹配字符串
本文关键字:字符串 之间 字符 | 更新日期: 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]);
}
试试这个正则表达式。
^.*?'-(.*?)'-
这个正则表达式的作用是,它只捕获在一个正则表达式组中-
之间的内容的第二次出现。
如何:
- ('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* | ([^ ]*)
_ _ _ _ |_________