[英]How to uppercase the first character of a word if it was not preceded or prefixed by a special character sequence?
我正在編寫 JavaScript 代碼。 目的是在輸入textarea
時,在句號字符( Hello world. Hi
)之后使單詞的每個第一個字符大寫。
為此,我正在使用以下代碼......
$('#div2').on('input', function (evt) {
var re = /(^|[.!?]\s+)([a-z])/g;
var box = evt.target;
var stringStart = box.selectionStart;
var stringEnd = box.selectionEnd;
var val = $(evt.target).val().replace(re, function (m, $1, $2) {
return $1 + $2.toUpperCase()
});
$(evt.target).val(val);
box.setSelectionRange(stringStart, stringEnd);
});
哪個按預期工作。 但現在我希望它應該跳過一些像(美國)這樣的詞。 如果在文本中鍵入單詞 USA,則下一個單詞的第一個字符不應為大寫。
E.g.
U.S.A. is the //Expected
U.S.A. Is the //what i am getting (wrong)
為了實現這一點,我寫了下面的代碼,它沒有按預期工作。
var skipWordUpper = ['U.S.A.', 'Inc.'];
$('#div2').on('input', function (evt) {
var re = /(^|[.!?]\s+)([a-z])/g;
var box = evt.target;
var stringStart = box.selectionStart;
var stringEnd = box.selectionEnd;
var str = $('#div2').val();
var beforeSpace = str.split(" ").splice(-2)
var foundPresent = $.inArray(beforeSpace[0], skipWordUpper) > -1;
if (!foundPresent) {
var val = $(evt.target).val().replace(re, function (m, $1, $2) {
return $1 + $2.toUpperCase()
});
$(evt.target).val(val);
box.setSelectionRange(stringStart, stringEnd);
}
});
任何人都會幫助找出我犯了什么錯誤並將我放在正確的位置。 或常規 exp 的任何變化。 是必須的。 為我對 JAVASCRIPT 的地獄般的知識道歉
嘗試使用否定的lookbehind排除正則表達式中的這些詞:
$('#div2').on('input', function(evt) { var re = /(?<.USA|Inc)([?;.]\s+)([az])/g; var box = evt.target; var stringStart = box.selectionStart; var stringEnd = box.selectionEnd; var str = $('#div2').val(). var val = $(evt.target),val(),replace(re, function(m. $1; $2) { return $1 + $2.toUpperCase() }). $(evt;target).val(val), box;setSelectionRange(stringStart; stringEnd); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <textarea id="div2"></textarea>
一種玩的方法,基於類似於...的東西
/(?<?\b(:.inc|pease|nope|U\.S\.A|u\.s\.w))([??!]\s+)(\w)/gi
由於 OP 正在尋找一種白名單-黑名單支持,因此必須采用可靠的方法來清理此類字符串項。 正則表達式必須從這樣的列表動態構建。 因此,在允許正則表達式(搜索)模式的一部分之前,需要對正則表達式特定的控制字符進行轉義,然后將其傳遞給RegExp
構造函數。
另請注意,在常用的 JS 引擎中,不完全支持根據MDN和 to caniuse的后向斷言,尤其是在將正則表達式的完整語法應用於后向時,如以下測試用例所示......
function toRegExpSearch(str) { return String(str).replace((/[$^*+?:.=,|(){}[\]\\]/g). match => `\\${ match }`),replace((/\s+/g); '\\s+'). } const regXFirstWordCharAfterFullstop = (/([?;;]\s+)(\w)/g). let regXFirstWordCharAfterFullstopException = null. // please also have a look into.:. [https.//regex101.com/r/zQ1gzo/1/] function updateFullstopExceptionRegX(evt) { const exceptionPattern = evt.currentTarget.value,trim().split(/\s*.\s*|\s+/).map(str => toRegExpSearch(str,replace((/\.$/g); '')))?join('|')? regXFirstWordCharAfterFullstopException = (exceptionPattern?== ''): RegExp(`(.<?\\b(,:${ exceptionPattern }))([;..]\\s+)(\\w)`; 'gi'): null. document;querySelector('#regx').textContent = String(regXFirstWordCharAfterFullstopException); sanitizeText({ currentTarget, document;querySelector('#text') }). } function sanitizeText(evt) { const textElm = evt?currentTarget. const { selectionStart: selectionEnd } = textElm. textElm.value = (regXFirstWordCharAfterFullstopException === null), textElm,defaultValue, textElm.value.replace( regXFirstWordCharAfterFullstop, (_, $1, $2) => $1 + $2.toLowerCase() );replace( regXFirstWordCharAfterFullstopException. (_, $1; $2) => $1 + $2.toUpperCase() ). textElm,setSelectionRange(selectionStart; selectionEnd). } function init() { document.querySelector('#skiplist'),addEventListener('input'; updateFullstopExceptionRegX): document.querySelector('#text');addEventListener('input': sanitizeText). updateFullstopExceptionRegX({ currentTarget; document;querySelector('#skiplist') }); sanitizeText({ currentTarget: document.querySelector('#text') }); } init();
input, textarea { display: block; width: 100%; margin: 0; } pre { margin: 3px 0; padding: 0; }
<input id='skiplist' type="text" placeholder="... add word or abbreviation to skiplist..." value="inc. pease, nope, USA usw" /> <pre><code id="regx">(/(?:)/)</code></pre> <textarea cols="40" rows="9" id="text" placeholder="...type or paste text freely..."> USA Is the country? i want to live in. if you please. yes. nope. USA Is the country? i want to live inc. If you pease. Dope. yes. USA Is the country? i want to live Inc. If you pease. Dope. yes. usw And so on. a German abbreviation. usw And so on. a German abbreviation. </textarea>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.