如何使用正则表达式避免在 unicode 重音后大写字母 [重复]

Posted

技术标签:

【中文标题】如何使用正则表达式避免在 unicode 重音后大写字母 [重复]【英文标题】:How to avoid capitalizing letters following unicode accents with regex [duplicate] 【发布时间】:2020-10-04 04:46:42 【问题描述】:

几个小时和几天以来,我一直在寻找正则表达式问题的解决方案。

这是一个字符串示例,我尝试将首字母大写:

test-de'Maëly dUIJSENS

/\b[a-zA-Z]/g

我设法很好地隔离了第一个字母,但是带重音的字母给我带来了问题,我的结果总是在带重音的字母后面给出一个大写字母:

Test-De'MaëLy Duijsens

我的预期结果如下:

Test-De'Maëly Duijsens

这是我的尝试:

function testcapital ()
  var xxx = capitalizePhrase("test-de'Maëly dUIJSENS")


function capitalizePhrase(phrase) 
  var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";

  phrase  = phrase.toLowerCase()
  var reg = /\b[a-zA-Z]/g;
  function replace(firstLetters) 
    return firstLetters.toUpperCase();
  
  capitalized = phrase.replace(reg, replace);
  return capitalized;

如何防止重音字符列表后出现大写?

【问题讨论】:

【参考方案1】:

您可以将 unicode 字符放入一个字符类中,该字符类可用于负向回溯:

const capitalizePhrase = phrase => 
  const accentedChars = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
  const reg = new RegExp(`\\b(?<![$accentedChars])([a-z])`, "g");
  return phrase.toLowerCase().replace(reg, m => m.toUpperCase());
;

console.log(capitalizePhrase("test-de'Maëly dUIJSENS"));

【讨论】:

这里不需要u修饰符。它没有做任何特别的事情。 \b 仍然只能识别 ASCII。

以上是关于如何使用正则表达式避免在 unicode 重音后大写字母 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配 perl 正则表达式 (regexp) 中的重音字符和波浪字符?

使用 Javascript 正则表达式匹配重音字符

使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符

如何使用正则表达式可移植地解析(Unicode)度数符号?

如何在 perl 正则表达式替换命令中使用 unicode 字符?

用于输入验证的正则表达式白名单 - 不区分重音