【问题标题】:Regular Expression to make first letter of each word capital including special characters正则表达式使每个单词的首字母大写,包括特殊字符
【发布时间】:2020-04-15 18:22:29
【问题描述】:

我正在开发葡萄牙语应用程序,所以我的正则表达式必须包含以下字符 (áàâãéèêíïóôõöúçñ) 到目前为止我有 /(\b[a-z])/g 但它将这些特殊字符视为新单词的开头。我在 Javascript 中这样做

例子:

输入:rua são luiz
当前输出:Rua SãO Luiz
期望输出:Rua São Luiz

【问题讨论】:

  • 您可能需要指定您使用的语言,因为所有正则表达式引擎都存在差异
  • 感谢您的提醒!这是我在这里的第一篇文章,我不知道正则表达式因语言而异
  • 您可以使用正则表达式 (?<![:alpha:])([:lower:]) 保存每个单词的第一个字符,它是一个 Unicode 小写字母以捕获组 1,然后使用反向引用 \1 将这些字母转换为大写。 Demo(?<![:alpha:]) 是一个否定的lookbehind,意味着匹配[:lower:] 的字符前面不能有(Unicode)字母。

标签: javascript regex


【解决方案1】:

这个正则表达式的问题是\b。它是通过对不包括重音字符的单词字符 (\w) 的引用来定义的。因此,示例中的 ã 是单词边界。您可以在此处阅读有关字符类和断言的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

我可以建议另一种不使用正则表达式的方法吗?

'rua são luiz'
    .split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ')

这只是我个人的看法:正则表达式很快就会变得非常难以理解和调试。有时,更冗长的代码可能是更易于维护的解决方案。

【讨论】:

  • "XXX 很快就会变得非常难以理解和调试。"经常从不熟悉任何计算机语言的人那里听到。虽然确实有许多情况可以使用复杂的正则表达式,但其他方法更可取,但在这种情况下,可以使用相对简单的正则表达式。猜测你不熟悉的方法的难度是没有帮助的。
  • @CarySwoveland 我认为建议 Manuel 不熟悉或不熟悉正则表达式是不公平的。可以客观地说,复杂的正则表达式比代码更难理解和更难调试。有几个原因: 1. 调试:没有“调试”正则表达式的工具(虽然有一些工具可以通过突出显示匹配的部分来提供帮助,但没有办法像处理代码那样“单步调试”正则表达式引擎)。正则表达式引擎是有状态的,但我们没有进入该状态的窗口。 2. 不能对正则表达式的部分进行注释。
  • 这就像查看缩小的代码。试一试能明白吗?是的。但它永远不会像完整源代码那样可读。
  • @Codebling,手册并没有说这里不应该使用正则表达式,因为它必须非常复杂(鉴于我在评论中给出的相对简单的正则表达式,这将是不正确的以上),但建议一般应避免使用正则表达式,因为它们可能变得复杂。考虑到它们的效用,我不能接受。请注意,通过在 free-spacing mode 中定义 cmets,可以将它们包含在正则表达式中。
  • @CarySwoveland 您提供的正则表达式在 Javascript 中不起作用。即使您链接的演示也会产生模式错误。如果您知道如何使用 Javascript(而不是 POSIX 或其他任何东西)中的简单正则表达式来解决这个问题,请告诉我们。我总是有兴趣了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2014-10-16
  • 2017-04-10
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多