我正在寻找一个正则表达式,可以在句子中识别句子中的连续单词以大写字母开头。
如果我们以下面的文字为例:
A-Z集团是一家历史悠久的集团 提供市场领导者 全球航空货运信息 社区,也为防御 和BDEC的安全部门 有限的,英国的出版商 国防设备目录和 英国国防工业名录。
我希望能够检索以下内容:
A-Z集团
BDEC有限国防设备
目录英国国防
IndustryDefence Industry
这是否可以使用正则表达式? 如果是这样,有人可以提出一个吗?
答案 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