簡體   English   中英

如果單詞的第一個字符沒有以特殊字符序列開頭或前綴,如何將其大寫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM