使用首字母大写的连续单词的正则表达式

时间:2010-11-06 12:25:45

标签: regex

我正在寻找一个正则表达式,可以在句子中识别句子中的连续单词以大写字母开头。

如果我们以下面的文字为例:

  

A-Z集团是一家历史悠久的集团   提供市场领导者   全球航空货运信息   社区,也为防御   和BDEC的安全部门   有限的,英国的出版商   国防设备目录和   英国国防工业名录。

我希望能够检索以下内容:

  

A-Z集团

     

BDEC有限国防设备

     

目录英国国防

     

IndustryDefence Industry

这是否可以使用正则表达式? 如果是这样,有人可以提出一个吗?

4 个答案:

答案 0 :(得分:9)

(更新:我最初误解了你的问题。)

一个简单的案例是

/([A-Z][\w-]*(\s+[A-Z][\w-]*)+)/

如果存在不同语言构造的特殊情况,可能需要修改。

ruby-1.9.2-p0 > %Q{The A-Z Group is a long-established market leader in the provision of information for the global air cargo community, and also for the defence and security sectors through BDEC Limited, publishers of the British Defence Equipment Catalogue and British Defence Industry Directory.}.scan(/([A-Z][\w-]*(\s+[A-Z][\w-]*)+)/).map{|i| i.first}

=> ["The A-Z Group", "BDEC Limited", "British Defence Equipment Catalogue", "British Defence Industry Directory"]

答案 1 :(得分:4)

希望这会做你想做的事,但如果我误解了道歉,那就道歉了。

([A-Z][a-zA-Z0-9-]*[\s]{0,1}){2,}

正则表达式搜索以下序列的两个或多个连续出现:大写字母后跟任意数量的小写/大写/数字/连字符(将此更改为任何范围的非空白字符以满足您的课程需要),后面跟一个空白字符。

编辑:我知道这是常识,但只是确保你将正则表达式搜索设置为区分大小写,当我测试时抓住了我:p

编辑:正如动静能量所指出的,上述正则表达式将匹配单个单词THE,因为它不强制至少前两个项目之间必须有空格。更正版本:

([A-Z][a-zA-Z0-9-]*)([\s][A-Z][a-zA-Z0-9-]*)+

答案 2 :(得分:3)

从非技术术语开始思考。你想要什么?一个“单词”后跟一个或多个“单词分隔符后跟单词”

现在你只需要为“单词”和“单词分隔符”定义模式,然后将它们组合成一个完整的模式。

当你将其分解时,复杂的正则表达式只不过是一些非常简单的模式组。

答案 3 :(得分:1)

$mystring = "the United States of America has many big cities like New York and Los Angeles, and others like Atlanta";

@phrases = $mystring =~ /[A-Z][\w'-]\*(?:\s+[A-Z][\w'-]\*)\*/g;

print "\n" . join(", ", @phrases) . "\n\n# phrases = " . scalar(@phrases) . "\n\n";

输出:

$ ./try_me.pl

United States, America, New York, Los Angeles, Atlanta

\# phrases = 5