簡體   English   中英

正則表達式:匹配所有不包含連字符的單詞

[英]Regex: Match all words that do not contain hyphen

這是我到目前為止所擁有的:

\\b(?<!-)\\w+(?!-)\\b

匹配包含連字符的內聯詞。

題:

有一種聰明的方法可以完成上述操作,但又不會在后面使用負面的看法嗎? (聰明是可選的)

通常,您要匹配[^-]\\b(\\w+)\\b[^-] -與連字符不相鄰的單詞。 這會很好用,但是由於它匹配單詞邊界,因此會消耗它們,並跳過其他所有單詞,因為后面的單詞不能匹配前導邊界。 (它也不匹配行尾或開頭,由非捕獲組和備選方案來解決: (?:[^-]|^)\\b(\\w+)\\b(?:[^-]|$) 。 )

您需要有關單詞邊界的信息而不消耗字符。 您可以從前瞻性或后向性獲取非消耗量: (?:[^-]|^)\\b(\\w+)\\b(?=[^-]|$)與您的單詞匹配。 這不適合問題陳述。

在我看來,您必須編寫代碼來獲得無消耗而無需先行/落后。 RegExp對象存儲最后消耗的字符的索引,因此我們可以通過稍微擺弄字符來“取消使用”字符。

function getAllWords(str) {
    let pat = /(?:[^-]|^)\b(\w+)\b(?:[^-]|$)/g;
    let res;
    let words = [];
    while (res = pat.exec(str)) {
        words.push(res[1]);
        pat.lastIndex--; //unconsume the word boundary so it can be matched again
    }
    return words;
}

由於前瞻大大簡化了這一切,並阻止了您擺弄對象內部,所以我真的建議您僅使用前瞻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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