【问题标题】:regex excluding a char before a symbol in JS正则表达式在 JS 中的符号前排除字符
【发布时间】:2022-01-16 19:52:49
【问题描述】:

我目前想将城市名称的第一个字母变成大写;但由于在我的国家,我们有很多城市名称由多个单词组成(例如纽约),我目前正在使用这个正则表达式:

/\w\S*/g

所以我正在使用这个功能

function capitalizeWords(myString) {
  return myString.replace(/\w\S*/g, w => w.replace(/^\w/, c => c.toUpperCase()))
}

所以我可以更改new yorkin New York。

但现在我有一个小问题,我有一些城市,比如

sauze d'oulx

我需要将其转换为Sauze d'Oulx,不包括d,或者在任何情况下' 符号之前的第一个字符。

在已知字符之前排除一个字符的技巧是什么?

【问题讨论】:

  • 从你的角色类中排除引用。但是,我怀疑你会处理所有这样的边缘情况,Zorro 前辈。
  • 如果有任何其他边缘情况,请包括它们。
  • 谢谢 :D 我正在考虑,唯一的其他边缘情况可能是排除空格前不超过 2 个字符的最后一个单词,例如。 bagno di romagna 变成 Bagno di Romagna,但我认为这是一个完全不同的正则表达式
  • 其实还有很多边缘情况List of double placenames

标签: javascript regex


【解决方案1】:

您可以在匹配和捕获预期匹配之前将所有异常定义为备选:

const texts = ["new york", "sauze d'oulx"];
const capitalizeWords = (myString) =>
  myString.replace(/\bd['’]|(\w)(\S*)/g, (m, g, h) => g ? g.toUpperCase() + h : m);
  
for (const text of texts) {
  console.log(text, '->', capitalizeWords(text));
}

\bd['’]|(\w)(\S*) 正则表达式匹配

  • \bd['’] - 在非单词字符之后或字符串开头的 d' 或 d’
  • | - 或
  • (\w)(\S*) - 捕获到第 1 组(上面代码中的g)的单词字符,然后在第 2 组(上面代码中的h)中捕获零个或多个非空格。

(m, g, h) => g ? g.toUpperCase() + h : m替换表示如果Group 1不匹配则替换为匹配本身,否则与\w匹配的字符大写。

用di介词扩展:

const texts = ["new york", "sauze d'oulx", "bagno di romagna"];
const capitalizeWords = (myString) =>
  myString.replace(/\bd(?:['’]|i\b)|(\w)(\S*)/g, (m, g, h) => g ? g.toUpperCase() + h : m);
  
for (const text of texts) {
  console.log(text, '->', capitalizeWords(text));
}

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多