我有一个textarea,我希望每个句子中的每个首字母大写。
现在我有了这个:
evt.target.value = evt.target.value.replace(/.+?[\.\?\!](\s|$)/g, function(a) {
return a.charAt(0).toUpperCase() + a.slice(1);
});
这是在af函数中,其中evt.target
是textarea,函数在keyup上调用。
它很有效,但它没有立即大写。 如果我写:
然后"我"只有当我把一段时间放在"这个"时才会大写。我希望它能把这个" I"键入后立即,如果它出现在"之后。 >空格<"或"! >空格<"或"? >空格<"嘿。我需要一些正则表达式。
我试过谷歌搜索很多东西,但不幸的是,这个正则表达式的东西对我来说太复杂了。有没有人可以正确地写这个,快速解释一下?
答案 0 :(得分:2)
我迟到了,但也许有人需要jQuery代码。 这也适用于第一句话。
$('input').on('input', function (evt) {
var $this = $(evt.target),
re = /(^|[.!?]\s+)([a-z])/g,
val = $this.val().replace(re, function (m, $1, $2) {
return $1 + $2.toUpperCase();
});
$this.val(val);
});
https://jsfiddle.net/chukanov/oqg5o88u/1/
es6更新:
let re = /(^|[.!?]\s+)([a-z])/g;
$('input').on('input', function (evt) {
let $this = $(this),
val = $this.val().replace(re, (m, $1, $2) => $1 + $2.toUpperCase());
$this.val(val);
});
答案 1 :(得分:1)
我建议使用/([!?.]\s+)([a-z])/g
正则表达式并将匹配传递给替换回调函数,以便仅在第二个捕获组的上方:
let log = document.querySelector('#log'),
test = document.querySelector('#test');
test.addEventListener('input', e => {
log.innerHTML = e.target.value.replace(/([!?.]\s+)([a-z])/g, function(m, $1, $2) {
return $1+$2.toUpperCase();
});
});
<input type='text' id='test' autofocus /><br />
<span id='log'></span>
模式详细信息:
([!?.]\s+)
- 第1组捕获!
,?
或.
以及1个或多个空格(请注意,将+
替换为*
,将允许零个或多个空格)([a-z])
- 第2组捕获小写ASCII字母。