【发布时间】:2017-06-18 04:50:48
【问题描述】:
我一直在尝试提取匹配前的单词。例如,我有以下句子:
“阿拉托纳是乔治亚州巴托县东南部的一个小镇。”
我想提取“Bartow”之前的单词。
我尝试了以下正则表达式来提取该单词:
\w\sCounty,
当我想要的只是巴托这个词时,我得到的是“w County”。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
我想你的意思是“County”之前的那个词,恰好是“Bartow”。
我一直在尝试提取匹配前的单词。例如,我有以下句子:
“阿拉托纳是乔治亚州巴托县东南部的一个小镇。”
我想提取“Bartow”之前的单词。
我尝试了以下正则表达式来提取该单词:
\w\sCounty,
当我想要的只是巴托这个词时,我得到的是“w County”。
任何帮助将不胜感激。谢谢!
【问题讨论】:
您可以使用此正则表达式和前瞻来查找County 之前的单词:
\w+(?=\s+County)
(?=\s+County) 是一个正向前瞻,它断言在当前匹配之前存在 1 个或多个空格,后跟单词 County。
如果您想避免前瞻,那么您可以使用捕获组:
(\w+)\s+County
并从匹配结果中提取捕获的组#1。
【讨论】:
您的\w\sCounty, 正则表达式返回w County,因为\w 匹配一个单个 字符,它可以是字母、数字或_。它不匹配整个单词。
要匹配 1 个或多个符号,您需要使用 + 量词,并且要捕获您需要提取的部分,您可以依赖 捕获组,@ 987654330@.
因此,您只需将 \w 替换为 (\w+) 即可修复您的模式,然后在匹配后访问 Match.Groups[1].Value。
但是,如果县名包含非单词符号(如连字符),\w+ 将无法匹配。在这种情况下,匹配 1 个或多个 非空白符号 的 \S+ 可能会成为更好的选择。
查看C# demo:
var m = Regex.Match(s, @"(\S+)\s+County");
if (m.Success)
{
Console.WriteLine(m.Groups[1].Value);
}
查看regex demo.
【讨论】:
您可以使用此正则表达式查找 Country 之前的单词
([\w]*.?\s+).?县
如果您想查找多个单词,只需在这样 ([\w]*.?\s+){3}.?County
之后添加 {n}【讨论】: