我被指出这篇文章,这似乎不符合我的标准:Replace a Regex capture group with uppercase in Javascript
我正在尝试创建一个正则表达式,它将:
- 通过为每个单词的首字母添加大写字母并为其余字符添加小写字母来设置字符串的格式
- 忽略HTML标记
- 接受瑞典语字符(åäöÅÖ)
假设我有这个字符串:
<b>app</b>le store östersund
然后我希望它是(用大写字符标记的变化)
<b>App</b>le Store Östersund
我一直在玩它,我得到的最接近的是以下内容:
(?!([^<])*?>)|\s\B\w
导致
<b>app</b>le Store Östersund
或者这个
/(?!([^<])*?>)[联系我们]|\S\B\w/g
导致
<B>App</B>Le store Östersund
2条答案
按热度按时间5ktev3wc1#
只使用regexp是不可能做到这一点的,因为regexp不理解HTML结构。[*]相反,我们需要处理每个文本节点,并执行我们的逻辑,以确定单词的开头,以防单词在不同的文本节点之间继续。如果一个字符前面有一个空格,或者它位于字符串的开头,并且它是第一个文本节点,或者是以空格结尾的前一个文本节点,则该字符位于单词的开头。
[*]也许有可能,但即使如此,它也会非常丑陋,因为它需要覆盖大量的角落案例。还可能需要比JavaScript更强大的RegExp引擎,比如Ruby或Perl。
编辑:
即使只是指定非常简单的html标签?目前我真正需要覆盖的只有
<b>
和</b>
。问题中没有具体说明这一点。该解决方案足够通用,可以用于任何标记(包括简单的标记)。但是...
ev7lccsx2#
我有一个几乎只使用正则表达式的解决方案。这可能不是最直观的方法,但它应该是有效的,我觉得很有趣:)
你必须在字符串的末尾附加每个小写字符,后面跟着对应的大写字符,就像这样(它前面还必须有一个空格来表示我的正则表达式):
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZåÅäÄöÖ
(我不知道哪些字母不见了,我对瑞典字母一无所知,对不起。我就指望你来纠正了!)
然后你可以使用下面的正则表达式:
(?![^<]*>)(\s<[^/]*?>|\s|^)([\wåäö])(?=.*\2(.)\S*$)|[\wåÅäÄöÖ]+$
替换为:
$1$3
测试here
下面是一个工作的javascript代码:
**编辑:**我忘记处理字符串的第一个单词,已更正:)