大写字母的正则表达式与重音字符不匹配

时间:2015-02-25 09:50:47

标签: ruby regex

我是ruby的新手,我正在尝试使用正则表达式。

我的文字看起来像是:

HEADING

Some text which is always non capitalized. Headings are always capitalized,     followed by a space or nothing more.

YOU CAN HAVE MULTIPLE WORDS IN HEADING

我正在使用这个正则表达式来选择所有标题:

^[A-Z]{2,}\s?([A-Z]{2,}\s?)*$

然而,它匹配所有不包含字符的标题,如Č,Š,Ž(斯洛文尼亚字符)。

所以我猜[A-Z]只匹配ASCII字符?我怎么能得到utf8?

2 个答案:

答案 0 :(得分:4)

当你定义ASCII范围A-Z时,你是正确的,匹配只是针对那些字符。这与计算机上的字符历史有关,随着时间的推移,越来越多的字符被添加,并且它们并不总是以易于使用的方式编码。

可以制作一个更大的字符类,通过列出它们来匹配你需要的斯洛文尼亚字符。

但是有一条捷径。其他人已经为Unicode数据添加了必要的数据,因此您可以为"所有大写字符":/[[:upper:]]/编写较短的匹配项。有关详情,请参阅http://ruby-doc.org//core-2.1.4/Regexp.html

仅通过此调整更改正则表达式:

^[[:upper:]]{2,}\s?([[:upper:]]{2,}\s?)*$

您可能需要进一步调整,例如它与标题不匹配" I AM A HEADING"由于比赛坚持每个单词至少有两个字母。

如果没有看到所有示例,我可能会简化组匹配并在任何地方允许空格:

^[[:upper:]\s]+$

答案 1 :(得分:2)

您可以使用unicode大写字母:

\p{Lu}

你的正则表达式:

\b\p{Lu}{2,}(?:\s*\p{Lu}{2,})\b

RegEx Demo