从字符串中删除特定单词

5
我正在尝试为一个项目解析街道名称文件,并需要删除修饰词(Upper / Lower / Old / New / North / East / South / West ...)和结尾(street / road / way / lane...),但是我在使用正则表达式时遇到了困难。
目前的设置是程序将逐行解析文件(即街道名称),并进行检查。我认为问题在于单词边界——例如,我需要进行以下转换...
Old Harrow Way -> Harrow(即删除“Old”前缀和“Way”结尾) Chittock Mead -> Chittock(删除结尾“Mead”) - 但在单词中不需要进行转换: Gold Lane -> Gold(只需删除结尾) Eastley Avenue -> Eastly(只需删除结尾) Upper Western Avenue -> Western(删除前缀和结尾)
显然,“South Street”等类似情况会同时删除两个元素——这没关系,因为我可以丢弃空字符串。
有人能给我一个实现方法吗?我已经阅读了有关正则表达式的资料并尝试了几个小时!

文件是什么格式?是CSV吗?制表符分隔或者根本没有这种格式吗?您是否有可靠的分隔符来区分不同的字段?文件是否是固定空格格式? - Oded
2
啊,这让我想起了一句老话:你有一个问题,你决定用正则表达式来解决。现在你有两个问题。:) 很抱歉我没有为您提供解决方案,只能加些俏皮的评论。祝你好运。 - David Hoerster
@David - 我相信这个词是由Jamie Zawinski创造的。 - Oded
@Oded,谢谢!我从来不知道这一点。而且他是匹兹堡人,就像我一样。 - David Hoerster
正则表达式可真让人头疼,我已经有一年没碰它们了,所以我同意,一个问题变成了两个。:) 虽然这里有很多优秀的正则表达式专家,我敢打赌他们可以在很短时间内解决这个问题。 - JonWillis
3个回答

2
我建议使用<list>Array来存储这些值,然后可能需要使用foreach循环将地址与列表或数组进行比对。之后,您可以使用.remove来移除列表或数组中每个实例。虽然还有更多的细节需要注意,但以上是大致的思路。

@Oded - 文件每行只有一个: abigail close<br /> abingdon road<br /> acorn close<br /> 等 - Richard

2
我会使用string.split(" ")将地址拆分成一个单词数组。然后,查看第一个单词是否存在于前缀列表(即a或Array)。对于最后一个单词和结尾也做同样的处理。
为每个输入地址运行两个正则表达式列表将非常耗时。如果列表已排序并进行了二分搜索,则使用我的逻辑应该更快。
如果地址数据有点脏(如标点符号、双空格等),您可能需要进行一些清理,因为像" Main St "这样的输入字符串将比实际上多出更多的'单词'(提示:Trim() 和RegEx.Replace(" "," "))。

好的,使用您建议的列表方法 - 它像梦一样工作! 还有一个小问题 - 我该如何匹配名称开头的“St”(例如“St. Mary's”),其中它可以是“St. Marys's”,“St Marys”,并且可能在“St [.]”之后有或没有空格?非常感谢您的帮助。 - Richard
好的,我得到了所有我需要的信息。再次感谢你的帮助! - Richard
我通常在分割地址之前用空格替换所有标点符号。 - Marc Bernier

1

这个问题或这个问题会对你有所帮助。确保使用Regex.Replace()方法进行模式匹配和替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接