2

我遇到了 RegExp 无法将特殊字符识别为单词字符的问题(或更糟 - 计为\b):

"wäww, xöxx  yüyy zßzz".replace(/\b\w/g,function(m){return m.toUpperCase();})

应该返回

"Wäww, Xöxx  Yüyy Zßzz"

但不幸的是返回:

"WäWw, XöXx  YüYy ZßZz"

我玩了几种编码,但这没有帮助......

如何让它识别字符或以其他方式解决该问题?

有一个问题与类似的问题没有令人满意的答案。

4

7 回答 7

2

欺骗

不要试图解决 unicode 和 js 的细微差别,只需使用空格作为替换/大写逻辑的标记:

> "wäww, xöxx  yüyy zßzz".replace(/( |^)[^ ]/g,function(m){return m.toUpperCase();});
"Wäww, Xöxx  Yüyy Zßzz"

或者

> "wäww, xöxx  yüyy zßzz".replace(/(\s|^)[^ ]/g,function(m){return m.toUpperCase();});
"Wäww, Xöxx  Yüyy Zßzz"

或者

> "wäww, xöxx  yüyy zßzz".replace(/([\s\.,:;]|^)[^ ]/g,function(m){return m.toUpperCase();});
"Wäww, Xöxx  Yüyy Zßzz"

这种技术将正确地大写重音字符:

> "wäww, öhyes".replace(/( |^)[^ ]/g,function(m){return m.toUpperCase();})
"Wäww, Öhyes"
于 2012-10-27T19:36:08.933 回答
1

我选择从不同的角度来攻克这个问题:我怎样才能得到每个单词的第一个字母?

这是我想出的:

"wäww, xöxx  yüyy zßzz".replace(/(?:^| )[^ ]/g,function(m){return m.toUpperCase();});

回报:

"Wäww, Xöxx  Yüyy Zßzz"
于 2012-10-27T19:39:09.963 回答
1

如果你只需要它来展示而不需要 Javascript 计算,设置 CSS 样式

text-transform: capitalize;

在元素上会起作用。

于 2012-10-27T19:40:17.407 回答
0

JavaScript 正则表达式\w仅将匹配的 Ascii 字母、常用数字和下划线字符视为匹配。一般来说,JavaScript 正则表达式在 Ascii 世界中发挥作用。

如果您有少量“特殊”字符需要处理,您可以单独对其进行编码,但一般来说,您应该寻找可以更一般地处理这种情况的库,正如对提到的问题Javascript + Unicode regexes的回答中所建议的那样@Pumbaa80 在评论中。

于 2012-10-27T19:26:27.800 回答
0

搜索[^a-zA-Z ,]|[a-zA-z]并替换为x

你可以在这里看到这个工作

于 2012-10-27T19:23:28.420 回答
0

您必须修改您的正则表达式:

"wäww, xöxx  yüyy zßzz".replace(/[\wäüßö]/g,"x")
于 2012-10-27T19:09:57.070 回答
0

简单的方法是,反转您的表达式并手动定义所有非单词字符(不好但有用)

/[^\s,\.;+\- and much more]/g

如果您知道所有可能的单词字符,您可以这样做

/[\wäöüßÄÖÜ and much more]/g

于 2012-10-27T19:14:19.433 回答