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

3

我是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?

你期望的输出是什么?你想匹配除了 [A-Z] 以外的字母吗? - Avinash Raj
我想匹配:HEADING 还有: HEADING ČŽŠ,但我认为这些字母已经在[A-Z]中匹配了,但看起来并不是这样。 - n32303
2个回答

5

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

你可以通过列出需要匹配的斯洛文尼亚字符来创建一个更大的字符类。

但是有一种捷径。其他人已经将必要的数据添加到Unicode数据中,这样你就可以为“所有大写字符”编写更短的匹配: /[[:upper:]]/。欲了解更多信息,请参见http://ruby-doc.org//core-2.1.4/Regexp.html

只需进行此调整即可更改您的正则表达式:

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

您可能需要进一步调整它,例如,由于匹配要求每个单词至少为两个字母长,因此它将不匹配标题“我是标题”。

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

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

我该如何使用字符串分割函数来将文本中的食谱(比如:RECIPE ONE use this and this and this RECIPE TWO this and other)按照标题分割成不同的食谱呢? - n32303
1
@NejcLovrencic:对我来说,这似乎是一个新问题,请不要在您的项目下一部分中扩展您的问题。也许你可以看一下 Ruby 的 String#splitString#scan 方法作为可能的起点。 - Neil Slater

3
您可以使用 Unicode 大写字母:
\p{Lu}

你的正则表达式:

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

正则表达式演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接