正则表达式匹配专有名词+数字

时间:2016-06-27 12:30:43

标签: regex

我正在尝试制作一个匹配专有名词的正则表达式,包括数字(如果有的话),即Fifa 2017

我有这个:

(?:\s*\b([A-Z][a-z]+)\b)+

...获取没有数字的字符串。

http://regexr.com/3dmuo

进行测试

我已经摆弄了这么多方法,但是我敢说我的能力略高于我的能力。

提前感谢任何建议。

3 个答案:

答案 0 :(得分:1)

此解决方案显示如何匹配类似于"专有名词的单个单词"接下来是一个数字。这明确匹配一个类似于字母的字符串,以大写字母开头,后跟任意数量的字母或数字,直到达到一个空格,然后是任意数量的数字。



data = [
  "I am reviewing Fifa 2017",
  "I am reviewing Mighty No 9",
  "I am writing about Unreal Engine",
  "Are you interested in MotoGP 2017?",
  "When does NASCAR 2017 start?",
  "Can Team Ferrari win Formula1 2017?",
  "Or will Red Bull take the Formula 1 2017 win?",
  "I plan to see F-1 2019, so I best start planning now!",
  "Have you used an Apple Mac Book Pro lately?",
  "Microsoft makes consumer operating systems"
];

for (var i in data) {
  var match = data[i].match(/(?:\b[A-Z][A-Za-z0-9]+\b)(?:\s*\b[A-Z][A-Za-z0-9]+\b)*(?:\s*\d+)?/g);
  if (match) {
    console.log(data[i], " match: ", match)
  } else {
    console.log(data[i], " doesn't match!")
  }
}




所使用的数据被视为" Fifa 2017"的原始例子的重复段,并且还代表了其他主要的运动季节。这里有各种各样的要求。

一个失败的例子是针对" F-1 2019",因为它不符合原始规范。匹配这种情况并不困难,但规范需要扩展以适应。

由于规范,还有一些错误的匹配。这些匹配要么是因为匹配的文本看起来像一个"专有名词" (例如"当","或","有")或#34;专有名词"中的数字,但是用空格分隔(例如& #34; Formula 1 2017"匹配" Formula 1",但不是" 2017")。这些可能会或可能不会被正则表达式严格处理,甚至可能太复杂,无法在一般情况下解决。

如果输入文本受到适当约束,则此类搜索可以正常工作,但可能会出现意外情况的异常。

答案 1 :(得分:0)

试试这个:

  (?:\s*\b([A-Z][a-z]+)\b)+\s?(\d+)?

答案 2 :(得分:0)

我查看了Wikipedia: Letter Case中专有名词的规则,以创建一种相当全面的英语专有名词查找器。我没有进行过正则表达式的正式培训,所以请指出任何错误(仍然不知道\b的工作原理,哈哈)。

(\b(the\b\s\b)?((([A-Z]('[A-Z])?[a-z]+)-*)+\b((\s\b(of|the|de|los|e|van|der|von|zu|d|di|ibn)\b)*(\s\b([A-Z]('[A-Z])?[a-z]+)-*)+\b)*)+)+

此解析器的主要问题是它将每个句子的开头识别为专有名词。

这对您来说可能是理想的,因为另一种选择是有时会识别不连续的单词。例如,如果您实施以下解决方案,Jade Smith is swell. Tim van Smythe isn't会将SmithSmythe识别为唯一的专有名词。

如果您的解析器支持负向后看,则可以在正则表达式字符串前加上(?<!([.!?;]\s\b)|^)

某些解析器(例如python的re模块)会将^(字符串的开头)视为非固定宽度,并拒绝您的搜索。我对此问题的解决方案是将其删除(将前缀设为(?<![.!?;]\s\b),然后将.放在输入字符串中。

这匹配以单个大写字母开头的所有(大多数)单词。它的确允许使用复杂的名称,但显然并没有考虑所有因素。在只匹配正确大写的专有名词方面,我相当固执,但是regex有局限性,一开始我不太擅长。

例如,这是潜在匹配项的列表:

  • Tam O'Shanter或Tam-O-Shanter,但不包括Tam o'Shanter或Tam-o-Shanter
  • 里约热内卢或里约热内卢(据我所知都是正确的)
  • Ludvig van Halen
  • Shea D'Angelo和Shea d Angelo,但不是Shea d'Angelo

它与NBA,FIFA或NHL等首字母缩写词不匹配。重要的是,这意味着它不会与Jonah J. Jamieson作为完整的专有名词匹配(它将与JonahJamieson作为两个单独的名词匹配)。它不能处理单字母专有名词。