我有一个文本区,我希望每个句子中的第一个字母都是大写的。
现在我有了这个:
evt.target.value = evt.target.value.replace(/.+?[\.\?\!](\s|$)/g, function(a) {
return a.charAt(0).toUpperCase() + a.slice(1);
});
这是af函数,其中evt.target
是textarea,函数在keyup上调用。
它工作得很好,只是它不会立即资本化。如果我写:
嘿。我需要一些正则表达式。
只有当我在"this“结尾加上一个句号时,"I”才会资本化。如果". >whitespace<“或"!>whitespace<”或"?>whitespace<“后面出现,我希望它在输入后立即大写"I”。
我试过搜索很多东西,但不幸的是,这个正则表达式对我来说太复杂了。有人能用快速的解释把这个写得正确吗?
发布于 2016-10-07 14:49:00
我迟到了,但也许有人需要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);
});
发布于 2016-10-07 14:07:31
我建议使用/([!?.]\s+)([a-z])/g
regex,并将匹配传递给替换回调函数,仅将匹配传递到第二个捕获组的上部:
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字母。https://stackoverflow.com/questions/39918994
复制相似问题